Linux内核分析之简析system_call中断处理过程
2017-03-20 14:19
393 查看
SA16225055冯金明
原创作品转载请注明出处
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
2.根据本周所学知识分析系统调用的过程,从system_call开始到iret结束之间的整个过程,并画出简要准确的流程图
添加Getpid()和Getpid_Asm()两个函数
![](https://img-blog.csdn.net/20170320143236087?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvS2ltaV9taW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
添加两个函数的调用命令
![](https://img-blog.csdn.net/20170320143620761?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvS2ltaV9taW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
重新编译和生成新的文件系统
![](https://img-blog.csdn.net/20170320144052927?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvS2ltaV9taW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
系统启动显示结果:
![](https://img-blog.csdn.net/20170320144825172?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvS2ltaV9taW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
2.跟踪系统调用
创建sys_getpid的断点:
![](https://img-blog.csdn.net/20170320145004986?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvS2ltaV9taW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
s命令的单步调试:
![](https://img-blog.csdn.net/20170320145004986?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvS2ltaV9taW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20170320145153035?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvS2ltaV9taW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
简
system_call相关的具体代码如下图所示(在kernel/entry_32.s中)
![](https://img-blog.csdn.net/20170320151038653?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvS2ltaV9taW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20170320151218140?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvS2ltaV9taW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
此段代码 都是汇编代码所写,晦涩难懂。因此,使用孟宁老师缩写的伪代码来进行分析,实为明智之选。
![](https://img-blog.csdn.net/20170320152521566?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvS2ltaV9taW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
定义两个两个宏,分别为:SAVE_ALL和RESTORE_ALL
![](https://img-blog.csdn.net/20170320152735145?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvS2ltaV9taW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
14行:SAVE_ALL 保存现场
16行:可以跳转至相应的系统调用处理函数
17行:保存中断处理的相关返回值
18-20行:检测是否有任务需要执行,如有,则跳转至syscall_exit_work
21行:restore_all 恢复现场
23行:irq_return 系统调用返回,调用结束
下面将对syscall_exit_work进行简单分析:
![](https://img-blog.csdn.net/20170320153640676?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvS2ltaV9taW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
26-28行:判断是否需要处理信号,如需要则跳转至work_pending
29行:结束任务处理
30-32行:work_notifysig 进行信号处理
33-35行:可能会存在进程调度,则会执行call schedule 然后再跳转至restore_all 返回系统调用
根据以上所分析得大致流程,可以画出我所理解的system_call中断处理过程的流程图:
![](https://img-blog.csdn.net/20170320161721138?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvS2ltaV9taW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
原创作品转载请注明出处
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
实验内容
实验要求:
1.使用gdb跟踪分析一个系统调用内核函数(必须选用上周所使用的系统调用)2.根据本周所学知识分析系统调用的过程,从system_call开始到iret结束之间的整个过程,并画出简要准确的流程图
实验具体操作及相关截图:
1.修改test.c文件和重新生成根文件系统添加Getpid()和Getpid_Asm()两个函数
添加两个函数的调用命令
重新编译和生成新的文件系统
系统启动显示结果:
2.跟踪系统调用
创建sys_getpid的断点:
s命令的单步调试:
简
9cee
析system_call中断处理过程
system_call相关的具体代码如下图所示(在kernel/entry_32.s中)此段代码 都是汇编代码所写,晦涩难懂。因此,使用孟宁老师缩写的伪代码来进行分析,实为明智之选。
定义两个两个宏,分别为:SAVE_ALL和RESTORE_ALL
14行:SAVE_ALL 保存现场
16行:可以跳转至相应的系统调用处理函数
17行:保存中断处理的相关返回值
18-20行:检测是否有任务需要执行,如有,则跳转至syscall_exit_work
21行:restore_all 恢复现场
23行:irq_return 系统调用返回,调用结束
下面将对syscall_exit_work进行简单分析:
26-28行:判断是否需要处理信号,如需要则跳转至work_pending
29行:结束任务处理
30-32行:work_notifysig 进行信号处理
33-35行:可能会存在进程调度,则会执行call schedule 然后再跳转至restore_all 返回系统调用
根据以上所分析得大致流程,可以画出我所理解的system_call中断处理过程的流程图:
总结
system_call是Linux中所有系统调用的入口点,每个系统调用都至少需要有一个参数,即由eax传递进入的系统调用号。call *sys_call_table(,%eax,4)函数,就是通过eax传递进来的系统调用号来寻找相信的系统调用处理函数。系统调用本质上是一种特殊的中断,所以它也需要进行现场的保存和结束调用后的恢复。在系统调用处理的同时,是会存在信号处理或者进程调度的,其中的工作切换还是很麻烦,在此我就不做详细讲解,分析到此,谢谢各位大佬的查阅。如有不足,还请大家指出!!!相关文章推荐
- Linux内核分析第五周学习总结——分析system_call中断处理过程
- Linux内核分析——分析system_call中断处理过程
- Linux内核分析学习笔记:system_call中断处理过程
- linux内核分析作业5:分析system_call中断处理过程
- Linux内核分析-分析system_call中断处理过程
- MOOC《Linux内核分析》——分析system_call中断处理过程
- Linux内核设计第五周学习总结 分析system_call中断处理过程
- linux内核分析第五周-分析system_call中断处理过程
- Linux内核分析(实验五)分析system_call中断处理过程
- [网易云课堂]Linux内核分析(五)—— 分析system_call中断处理过程
- 第5节 分析system_call中断处理过程【Linux内核分析】
- Linux内核分析实验五—分析system_call中断处理过程
- Linux内核分析:分析system_call中断处理过程
- 《Linux内核分析》第五周:分析system_call中断处理过程
- system_call中断处理过程分析
- 分析system_call中断处理过程
- 分析system_call中断处理过程
- 分析system_call中断处理过程
- 网易公开课《Linux内核分析》学习心得-分析system_call中断处理过程
- 魏昊卿——第五周作业:分析system_call中断处理过程