系统调用的执行过程分为两个阶段:从用户空间到系统空间;从system_call函数到系统调用服务例程。
1、从用户空间到系统空间:
不同平台有不同的指令来完成从用户空间到系统空间的转换,这类指令被称为操作系统陷入指令。对于x86体系来说,通过软中断int 0x80实现。通过该指令,系统会转到一个预设的内核空间地址。这个地址就是系统调用处理程序system_call函数。
2、从system_call函数到系统调用服务例程:
执行int 0x80之后,系统调用的参数会被保存在eax、ebx、ecx、edx、esi、edi寄存器中。eax传递的是系统调用号。系统调用号乘以4作为偏移地址再加上sys_call_table的基址就得到了系统调用服务例程的地址。
除了找到系统服务例程的地址外,还把寄存器中的参数压栈。因为系统调用服务例程只能从堆栈中获得参数。
在系统调用服务例程执行完之后,用户程序可直接从寄存器中获得被修改过的参数。
注意:system_call执行用的是进程的上下文而不是中断的上下文。
阅读(1770) | 评论(0) | 转发(0) |