第五周 system_call中断处理过程
1.实验
这里的实验主要是将上一周实现的那个系统中断中断程序加载到系统内核当中。这里将汇编版本以及C语言版本分别加载到系统当中,并且利用gdb对系统调用进行调试。同周三的实验方法。将上周实现的fork函数加载到test.c当中如下图所示,利用MenuConfig将Fork以及Fork_asm设置成命令
然后参照 http://mooc.study.163.com/learn/USTC-1000029000#/learn/content?type=detail&id=1000116009&cid=1000101069 编译内核,启动gdb调试
这里由http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl 可知 fork是利用sys_fork进行系统调用,所以这里设置sys_fork断点,如下图
在程序中输入fork_asm命令可以得到如下结果
2.system_call 分析
刚开始需要对系统中断向量进行初始化主要通过以下两个函数进行设置:
设置后利用int 0x80就能触发system_call进行相关的设置。system call到iret间的流程图如下所示
syscall的代码
http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/kernel/entry_32.S#syscall_exit_work
这里要注意,系统调用完成后,并不会立刻返回用户态度,而是通过以下这条语句来检查是不是需要进行进程以及中断的上下文间的切换,然后才是恢复现场。
jne syscall_exit_work()
3.总结
上一周通过利用汇编的方式进行系统调用加深了对系统调用的理解,这一周则是学习了syscall中系统调用前后的代码,这里可以看到系统调用前后需要保存现场以及恢复现场,而在返回用户态之前需要检查下是否需要进程以及中断的切换。通过系统调用的实验可以推测出系统处理一般的中断程序也是采取类似的机制,只不过将系统调用的程序换成了中断处理程序,从这个角度来看,内核也可以看作是各种中断处理程序的以及系统调用的集合。