系统调用是受控的内核入口;
系统调用将处理器从用户态切换到核心态,以便CPU 访问受到保护的内核内存。
系统调用的组成是固定的,每个系统调用都由一个唯一的数字来标识。(程序通过名
称来标识系统调用,对这一编号方案往往一无所知。)
每个系统调用可辅之以一套参数,对用户空间(亦即进程的虚拟地址空间)与内核空
间之间(相互)传递的信息加以规范。
1. 应用程序通过调用C 语言函数库中的外壳(wrapper) 函数,来发起系统调用。
2. 对系统调用中断处理例程(稍后介绍)来说,外壳函数必须保证所有的系统调用参数可用。通过堆栈,这些参数传入外壳函数,但内核却希望将这些参数置入特定寄存器。因此,外壳函数会将上述参数复制到寄存器。
3. 由千所有系统调用进入内核的方式相同,内核需要设法区分每个系统调用。为此,外壳函
数会将系统调用编号复制到一个特殊的CPU 寄存器(¾eax) 中。
4. 外壳函数执行一条中断机器指令(int Ox80), 引发处理器从用户态切换到核心态,并执行
系统中断Ox80 (十进制数128) 的中断矢噩所指向的代码。
5. 为响应中断Ox80, 内核会调用system_callO例程(位千汇编文件arch/i386/entry.S 中)来
处理这次中断,具体如下。
a) 在内核栈中保存寄存器值(参见6.5 节)。
b) 审核系统调用编号的有效性。
c) 以系统调用编号对存放所有调用服务例程的列表(内核