您的位置:首页 > 其它

一个系统调用(SCI)的简化流程

2010-03-06 10:21 295 查看
SCI

Linux 中系统调用的实现会根据不同的架构而有所变化,而且即使在某种给定的体架构上也会不同。例如,早期的 x86 处理器使用了中断机制从用户空间迁移到内核空间中,不过新的 IA-32 处理器则提供了一些指令对这种转换进行优化(使用
sysenter
sysexit
指令)。由于存在大量的方法,最终结果也非常复杂,因此本文将着重于接口细节的表层讨论上。更详尽的内容请参看本文最后的 参考资料
要对 Linux 的 SCI 进行改进,您不需要完全理解 SCI 的内部原理,因此我将使用一个简单的系统调用进程(请参看图 1)。每个系统调用都是通过一个单一的入口点多路传入内核。eax 寄存器用来标识应当调用的某个系统调用,这在
C
库中做了指定(来自用户空间应用程序的每个调用)。当加载了系统的
C
库调用索引和参数时,就会调用一个软件中断(0x80 中断),它将执行
system_call
函数(通过中断处理程序),这个函数会按照 eax 内容中的标识处理所有的系统调用。在经过几个简单测试之后,使用
system_call_table
和 eax 中包含的索引来执行真正的系统调用了。从系统调用中返回后,最终执行
syscall_exit
,并调用
resume_userspace
返回用户空间。然后继续在
C
库中执行,它将返回到用户应用程序中。

图 1. 使用中断方法的系统调用的简化流程



SCI 的核心是系统调用多路分解表。这个表如图 2 所示,使用 eax 中提供的索引来确定要调用该表中的哪个系统调用(
sys_call_table
)。图中还给出了表内容的一些样例,以及这些内容的位置。(有关多路分解的更多内容,请参看侧栏 “系统调用多路分解”)

图 2. 系统调用表和各种链接

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: