Linux操作系统分析6 syscall.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《Linux操作系统分析6 syscall.ppt》由会员分享,可在线阅读,更多相关《Linux操作系统分析6 syscall.ppt(38页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Linux操作系统分析操作系统分析中国科学技中国科学技术术大学大学计计算机系算机系陈陈香香兰兰(051287161312)Autumn 2010系统调用系统调用系统调用的意义系统调用的意义操作系统为用户态进程与硬件设备进行交互提供了一组接口系统调用把用户从底层的硬件编程中解放出来极大的提高了系统的安全性使用户程序具有可移植性2023/1/23Linux OS AnalysisAPI和系统调用和系统调用应用编程接口(application program interface,API)和系统调用是不同的API只是一个函数定义系统调用通过软中断向内核发出一个明确的请求Libc库定义的一些API引用了
2、封装例程(wrapper routine,唯一目的就是发布系统调用)一般每个系统调用对应一个封装例程库再用这些封装例程定义出给用户的API2023/1/24Linux OS Analysis不是每个API都对应一个特定的系统调用。API可能直接提供用户态的服务如,一些数学函数一个单独的API可能调用几个系统调用不同的API可能调用了同一个系统调用返回值大部分封装例程返回一个整数,其值的含义依赖于相应的系统调用-1在多数情况下表示内核不能满足进程的请求Libc中定义的errno变量包含特定的出错码2023/1/25Linux OS Analysis系统调用程序及服务例程系统调用程序及服务例程当用
3、户态进程调用一个系统调用时,CPU切换到内核态并开始执行一个内核函数。在Linux中是通过执行int$0 x80来执行系统调用的,这条汇编指令产生向量为128的编程异常(回忆,trapinit中系统调用入口的初始化)Intel Pentium II中引入了sysenter指令(快速系统调用),2.6已经支持(本课程不考虑这个)传参:内核实现了很多不同的系统调用,进程必须指明需要哪个系统调用,这需要传递一个名为系统调用号系统调用号的参数使用eax寄存器2023/1/26Linux OS Analysis所有的系统调用返回一个整数值。正数或0表示系统调用成功结束负数表示一个出错条件这里的返回值与封
4、装例程返回值的约定不同内核没有设置或使用errno变量封装例程在系统调用返回取得返回值之后设置这个变量当系统调用出错时,返回的那个负值将要存放在errno变量中返回给应用程序2023/1/27Linux OS Analysis系统调用处理程序也和其他异常处理程序的结构类似在进程的内核态堆栈中保存大多数寄存器的内容(即保存保存恢复进程到用户态执行所需要的上下文上下文)调用调用相应的系统调用服务例程系统调用服务例程处理系统调用sys_xxx通过ret_from_sys_call()从系统调用返回返回2023/1/28Linux OS Analysis应用程序、封装例程、系统调用处理程序及系统调用服
5、务例程之间的关系应用程序、封装例程、系统调用处理程序及系统调用服务例程之间的关系syscall_exit:2023/1/29Linux OS Analysis为了把系统调用号与相应的服务例程关联起来,内核利用了一个系统调用分派表(dispatch table)。这个表存放在sys_call_table数组中,有若干个表项(2.6.26中,是356):第n个表项对应了系统调用号为n的服务例程的入口地址的指针观察sys_call_table(syscall_table_32.S以及entry_32.S最后)2023/1/210Linux OS Analysis关于系统调用表的大小关于系统调用表的大
6、小2023/1/211Linux OS Analysis初始化系统调用初始化系统调用内核初始化期间调用trap_init()函数建立IDT表中向量128对应的表项,语句如下:讀 该调用把下列值存入这个系统门描述符的相应字段:segment selector内核代码段_KERNEL_CS的段选择符offset指向system_call()异常处理程序的入口地址type置为15。表示这个异常是一个陷阱,相应的处理程序不禁止可屏蔽中断DPL(描述符特权级)置为3。这就允许用户态进程访问这个门,即在用户程序中使用int$0 x80是合法的2023/1/212Linux OS Analysissyste
7、m_call()函数函数参见entry_32.S2023/1/213Linux OS Analysis参数传递参数传递系统调用也需要输入输出参数,例如实际的值用户态进程地址空间的变量的地址甚至是包含指向用户态函数的指针的数据结构的地址system_call是linux中所有系统调用的入口点,每个系统调用至少有一个参数,即由eax传递的系统调用号一个应用程序调用fork()封装例程,那么在执行int$0 x80之前就把eax寄存器的值置为2(即_NR_fork)。这个寄存器的设置是libc库中的封装例程进行的,因此用户一般不关心系统调用号进入sys_call之后,立即将eax的值压入内核堆栈对对
8、C库进行反汇编,察看库进行反汇编,察看int$0 x802023/1/214Linux OS Analysis很多系统调用需要不止一个参数普通C函数的参数传递是通过把参数值写入堆栈(用户态堆栈或内核态堆栈)来实现的。但因为系统调用是一种特殊函数,它由用户态进入了内核态,所以既不能使用用户态的堆栈也不能直接使用内核态堆栈用户态堆栈用户态C函数内核态堆栈内核态C函数2023/1/215Linux OS Analysis在int$0 x80汇编指令之前,系统调用的参数被写入CPU的寄存器。然后,在进入内核态调用系统调用服务例程之前,内核再把存放在CPU寄存器中的参数拷贝到内核态堆栈中。因为毕竟服务例
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux操作系统分析6 syscall Linux 操作系统 分析
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内