分析system_call中断处理过程

分析system_call中断处理过程

攥写人:李鹏举  学号:20132201

( *原创作品转载请注明出处*)

( 学习课程:《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000)

实验要求:

  1. 使用gdb跟踪分析一个系统调用内核函数(您上周选择那一个系统调用),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl ,推荐在实验楼Linux虚拟机环境下完成实验。

  2. 根据本周所学知识分析系统调用的过程,从system_call开始到iret结束之间的整个过程,并画出简要准确的流程图

实验过程:

     1.首先打开Menu文件夹中,修改text.c,并且加入上周的函数getppid():

  

2.将menu进行编译,make rootfs:

3.检查是否成功的增加了相应的功能:

 

实验分析:

  通过学习课程我们知道了,linux的系统调用过程:用户程序→C库(即API):INT 0x80 →system_call→系统调用服务例程→内核程序。我们常说的用户API其实就是系统提供的C库。

   系统调用是通过软中断指令 INT 0x80 实现的,而这条INT 0x80指令就被封装在C库的函数中。软中断和我们常说的硬中断不同之处在于,软中断是由指令触发的,而不是由硬件外设引起的。INT 0x80 这条指令的执行会让系统跳转到一个预设的内核空间地址,它指向系统调用处理程序,即system_call函数。系统调用处理程序system_call 并不是系统调用服务例程,系统调用服务例程是对一个具体的系统调用的内核实现函数,而系统调用处理程序是在执行系统调用服务例程之前的一个引导过程,是针对INT 0x80这条指令,面向所有的系统调用的。简单来讲,执行任何系统调用,都是先通过调用C库中的函数,这个函数里面就会有软中断 INT 0x80 语句,然后转到执行系统调用处理程序 system_call system_call 再根据具体的系统调用号转到执行具体的系统调用服务例程。

  而本次实验中我成功的将这个新的函数功能加入了原本的内核菜单中,并且学会了如何清除原来的菜单,下载并更新成为一个新的菜单,可以说学到了Linux内核菜单的修改与覆盖,但是我还是没有实现在自己的虚拟机上实现这些,qemu,git这些指令在虚拟机上都无法使用,导致编译内核这些部分都无法实现,通过今后老师的帮助,希望我的虚拟机可以实现实验楼的全部功能。

最后我做了一个流程图,总结从system_call开始到iret结束的过程:

系统调用

 

posted @ 2016-03-27 21:09  普普通通  阅读(506)  评论(0编辑  收藏  举报