系统调用

来源:互联网 发布:淘宝介入怎么撤销 编辑:程序博客网 时间:2024/05/23 21:24

进程和内核的交互:请求系统资源,访问外设,与其他进程间通信,读取文件等等;这样的流程是:进程使用标准库例程,标准库例程调用内核函数,内核负责各个请求进程之间公平流畅的共享资源和服务;

标准库是中间层,简化了内核例程的管理,系统调用是一个大的例程集合;

这里面需要掌握两个问题:1 在用户态和内核态中,控制权如何来回传递;2 参数和返回值如何传递;注明:不同的虚拟地址空间和各种处理器特性的不同方式;

实现一个新的系统调用:1编写系统调用服务例程;可以为新的例程创建一个新的文件保存,也可以将其定义在其他文件中,进行必要的注释,最后在include/linux/syscalls.h文件中添加原型声明,asmlinkage long sys_***(参数列表);

    2 添加系统调用号:更新linux/asm-i386/unistd.h文件,为***系统调用添加一个系统调用号,同时修改系统调用数目;

    3 修改系统调用表:为了让系统调用处理程序system_call函数找到***系统调用,需要修改系统调用表sys_call_table,放入服务例程的函数地址;

    4 重新编译内核并测试;


与内核交换信息方法:系统调用,使用设备驱动程序,使用proc虚拟文件系统(获取系统运行信息和修订系统状态),sysfs文件系统(用于系统的设备进行管理);


系统调用执行过程:阶段一,用户空间到内核空间转换阶段;不同的平台具有不同的指令,这些指令称为操作系统陷入指令,inux通过软中断实现这种陷入;

    阶段二,系统调用处理程序system_call函数到系统调用服务例程的阶段;所有的系统调用会统一跳转到这个地址执行system_call函数,

系统调用服务例程的地址:sys_call_table为基地址+系统调用号×字节数;服务例程定义的标记asmlinkage表示,编译器仅从堆栈中获取该函数的参数,不需要从寄存器中获得任何参数,进入system_call之前,用户应用将参数存放在对应的寄存器中,system_call执行时将这些寄存器有压入堆栈,参数的修改一直在堆栈中进行,system_call函数退出时,用户应用可以直接从寄存器中获得被修改过的参数;

系统调用执行过程中,可以访问用户进程的许多信息,可以被其他进程抢占(新的进程可能使用相同的系统调用,必须保证系统调用可重入),可以休眠(系统调用阻塞或显示效用schedule函数时),所以系统调用完成后,把控制权交给用户进程前,内核会有一次调度;


系统调用函数列表:


程控制:

fork创建一个新进程clone按指定条件创建子进程execve运行可执行文件exit中止进程_exit立即中止当前进程getdtablesize进程所能打开的最大文件数getpgid获取指定进程组标识号setpgid设置指定进程组标志号getpgrp获取当前进程组标识号setpgrp设置当前进程组标志号getpid获取进程标识号getppid获取父进程标识号getpriority获取调度优先级setpriority设置调度优先级modify_ldt读写进程的本地描述表nanosleep使进程睡眠指定的时间nice改变分时进程的优先级pause挂起进程,等待信号personality设置进程运行域prctl对进程进行特定操作ptrace进程跟踪sched_get_priority_max取得静态优先级的上限sched_get_priority_min取得静态优先级的下限sched_getparam取得进程的调度参数sched_getscheduler取得指定进程的调度策略sched_rr_get_interval取得按RR算法调度的实时进程的时间片长度sched_setparam设置进程的调度参数sched_setscheduler设置指定进程的调度策略和参数sched_yield进程主动让出处理器,并将自己等候调度队列队尾vfork创建一个子进程,以供执行新程序,常与execve等同时使用wait等待子进程终止wait3参见waitwaitpid等待指定子进程终止wait4参见waitpidcapget获取进程权限capset设置进程权限getsid获取会晤标识号setsid设置会晤标识号

二、文件系统控制

1、文件读写操作

fcntl文件控制open打开文件creat创建新文件close关闭文件描述字read读文件write写文件readv从文件读入数据到缓冲数组中writev将缓冲数组里的数据写入文件pread对文件随机读pwrite对文件随机写lseek移动文件指针_llseek在64位地址空间里移动文件指针dup复制已打开的文件描述字dup2按指定条件复制文件描述字flock文件加/解锁pollI/O多路转换truncate截断文件ftruncate参见truncateumask设置文件权限掩码fsync把文件在内存中的部分写回磁盘

2、文件系统操作

access确定文件的可存取性chdir改变当前工作目录fchdir参见chdirchmod改变文件方式fchmod参见chmodchown改变文件的属主或用户组fchown参见chownlchown参见chownchroot改变根目录stat取文件状态信息lstat参见statfstat参见statstatfs取文件系统信息fstatfs参见statfsreaddir读取目录项getdents读取目录项mkdir创建目录mknod创建索引节点rmdir删除目录rename文件改名link创建链接symlink创建符号链接unlink删除链接readlink读符号链接的值mount安装文件系统umount卸下文件系统ustat取文件系统信息utime改变文件的访问修改时间utimes参见utimequotactl控制磁盘配额

三、系统控制

ioctlI/O总控制函数_sysctl读/写系统参数acct启用或禁止进程记账getrlimit获取系统资源上限setrlimit设置系统资源上限getrusage获取系统资源使用情况uselib选择要使用的二进制函数库ioperm设置端口I/O权限iopl改变进程I/O权限级别outb低级端口操作reboot重新启动swapon打开交换文件和设备swapoff关闭交换文件和设备bdflush控制bdflush守护进程sysfs取核心支持的文件系统类型sysinfo取得系统信息adjtimex调整系统时钟alarm设置进程的闹钟getitimer获取计时器值setitimer设置计时器值gettimeofday取时间和时区settimeofday设置时间和时区stime设置系统日期和时间time取得系统时间times取进程运行时间uname获取当前UNIX系统的名称、版本和主机等信息vhangup挂起当前终端nfsservctl对NFS守护进程进行控制vm86进入模拟8086模式create_module创建可装载的模块项delete_module删除可装载的模块项init_module初始化模块query_module查询模块信息*get_kernel_syms取得核心符号,已被query_module代替

四、内存管理

brk改变数据段空间的分配sbrk参见brkmlock内存页面加锁munlock内存页面解锁mlockall调用进程所有内存页面加锁munlockall调用进程所有内存页面解锁mmap映射虚拟内存页munmap去除内存页映射mremap重新映射虚拟内存地址msync将映射内存中的数据写回磁盘mprotect设置内存映像保护getpagesize获取页面大小sync将内存缓冲区数据写回硬盘cacheflush将指定缓冲区中的内容写回磁盘

五、网络管理

getdomainname取域名setdomainname设置域名gethostid获取主机标识号sethostid设置主机标识号gethostname获取本主机名称sethostname设置主机名称

六、socket控制

socketcallsocket系统调用socket建立socketbind绑定socket到端口connect连接远程主机accept响应socket连接请求send通过socket发送信息sendto发送UDP信息sendmsg参见sendrecv通过socket接收信息recvfrom接收UDP信息recvmsg参见recvlisten监听socket端口select对多路同步I/O进行轮询shutdown关闭socket上的连接getsockname取得本地socket名字getpeername获取通信对方的socket名字getsockopt取端口设置setsockopt设置端口参数sendfile在文件或端口间传输数据socketpair创建一对已联接的无名socket

七、用户管理

getuid获取用户标识号setuid设置用户标志号getgid获取组标识号setgid设置组标志号getegid获取有效组标识号setegid设置有效组标识号geteuid获取有效用户标识号seteuid设置有效用户标识号setregid分别设置真实和有效的的组标识号setreuid分别设置真实和有效的用户标识号getresgid分别获取真实的,有效的和保存过的组标识号setresgid分别设置真实的,有效的和保存过的组标识号getresuid分别获取真实的,有效的和保存过的用户标识号setresuid分别设置真实的,有效的和保存过的用户标识号setfsgid设置文件系统检查时使用的组标识号setfsuid设置文件系统检查时使用的用户标识号getgroups获取后补组标志清单setgroups设置后补组标志清单

八、进程间通信

ipc进程间通信总控制调用

1、信号

sigaction设置对指定信号的处理方法sigprocmask根据参数对信号集中的信号执行阻塞/解除阻塞等操作sigpending为指定的被阻塞信号设置队列sigsuspend挂起进程等待特定信号signal参见signalkill向进程或进程组发信号*sigblock向被阻塞信号掩码中添加信号,已被sigprocmask代替*siggetmask取得现有阻塞信号掩码,已被sigprocmask代替*sigsetmask用给定信号掩码替换现有阻塞信号掩码,已被sigprocmask代替*sigmask将给定的信号转化为掩码,已被sigprocmask代替*sigpause作用同sigsuspend,已被sigsuspend代替sigvec为兼容BSD而设的信号处理函数,作用类似sigactionssetmaskANSI C的信号处理函数,作用类似sigaction

2、消息

msgctl消息控制操作msgget获取消息队列msgsnd发消息msgrcv取消息

3、管道

pipe创建管道

4、信号量

semctl信号量控制semget获取一组信号量semop信号量操作

5、共享内存

shmctl控制共享内存shmget获取共享内存shmat连接共享内存shmdt拆卸共享内存
0 0
原创粉丝点击