每个系统调用都有一个预定义的数字(见上表),那实际上是用来进行这些调用的。内核通过中断 0x80来控制每一个系统调用。这些系统调用的数字以及任何参数都将被放入某些寄存器(比如说, eax是用来放那些代表系统调用的数字)。那些系统调用的数字是一个被称之为sys_call_table[]的内核中的数组结构的索引值。这个结构把系统调用的数字映射到实际使用的函数。
系统调用发生在用户进程(比如emacs)通过调用特殊函数(例如open)以请求内核提供服务的时候。在这里,用户进程被暂时挂起。内核检验用户请求,尝试执行,并把结果反馈给用户进程,接着用户进程重新启动。
系统调用负责保护对内核所管理的资源的访问,系统调用中的几个大类主要有:处理I/O请求(open、close、read、write、poll等等)、进程(fork、execve、kill等等)、时间(time、settimeofday等等)以及内存(mmap、brk等等)的系统调用。几乎所有的系统调用都可以归入这几类。从根本上说,系统调用和表面并不完全相同,不同系统调用并不区分很细,有些系统调用是建立在别的系统调用的基础上的。
系统调用必须返回int的值,并且也只能返回int值。返回值为零或者为正说明调用成功,为负则说明发生了错误(最近的内核调用成功也可能返回负值,具体还需查errno)。
系统调用过程:
文章来源于领测软件测试网 https://www.ltesting.net/