一个系统调用(SCI)的简化流程
2010-03-06 10:21
295 查看
SCI
Linux 中系统调用的实现会根据不同的架构而有所变化,而且即使在某种给定的体架构上也会不同。例如,早期的 x86 处理器使用了中断机制从用户空间迁移到内核空间中,不过新的 IA-32 处理器则提供了一些指令对这种转换进行优化(使用
要对 Linux 的 SCI 进行改进,您不需要完全理解 SCI 的内部原理,因此我将使用一个简单的系统调用进程(请参看图 1)。每个系统调用都是通过一个单一的入口点多路传入内核。eax 寄存器用来标识应当调用的某个系统调用,这在
图 1. 使用中断方法的系统调用的简化流程
SCI 的核心是系统调用多路分解表。这个表如图 2 所示,使用 eax 中提供的索引来确定要调用该表中的哪个系统调用(
图 2. 系统调用表和各种链接
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. 系统调用表和各种链接
相关文章推荐
- 树莓派实验四: 增加一个linux系统调用
- 写了一个Flex的web流程设计器原型系统
- 一个系统调用加钩子函数的实现过程
- Android系统框架和几种调用流程 .
- Android系统调用流程---以open为例
- 编写一个系统调用
- imx6系列--将一个gpio设置为可唤醒系统的外部中断流程
- bpel流程调用一个同步服务(一)
- 一个基于qt的桌面聊天系统的学习笔记(1)-邮件模块(1)邮件界面的初始化流程
- 系统提示一个程序正在被另一个程序调用,如何知道是被哪个程序调用
- Linux添加一个新的系统调用
- Linux之使用内核模块增加一个系统调用
- 从零开始打造一个新闻订阅APP之服务器篇(一、系统结构设计&开发流程简介)
- 基于Linux系统调用使用php实现一个在线编译运行C语言程序的系统
- 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
- 编译Linux内核并向其增加一个自定义系统调用
- 通过调用C语言的库函数与在C代码中使用内联汇编两种方式来使用同一个系统调用来分析系统调用的工作机制
- 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
- 请教一个问题,Android应用运行时在调用某个API(比如相机)时,系统如何判断这个应用是否具备相应的权限?
- Android系统框架和几种调用流程