第五周:扒开系统调用的三层皮(下)

Posted 吕松鸿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第五周:扒开系统调用的三层皮(下)相关的知识,希望对你有一定的参考价值。

吕松鸿 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

实验:分析system_call中断处理过程

一、给MenuOS增加time和time-asm命令

1 rm menu -rf //强制删除原menu文件
2 git clone http://github.com/mengning/menu.git //从github中克隆
3 cd menu //在menu文件夹下才能正确编译
4 make rootfs //运行自动编译脚本,生成根文件系统,启动MenuOS

技术分享

技术分享

添加

技术分享

运行结果

技术分享

二、使用gdb跟踪系统调用内核函数sys_time

技术分享

设置断点跟踪

技术分享

跟踪系统调用内核函数sys_time:

(gdb)b sys_time
(gdb)c    # 启动到MenuOs
// 在MenuOs中使用time,会停在time函数处
(gdb)list # 可以看到对应代码
(gdb)s    # 单步执行
(gdb)finish # 将这个函数执行完
// 以上两步重复使用,可以看到sys_time函数中的函数,直到看见return i
// sys_time返回后进入汇编代码处理,gdb无法继续进行追踪

三、流程图

技术分享

四、系统调用在内核代码中的处理过程

system_call到iret之间的主要代码:

SAVE_ALL //保存现场
call *sys_call_table(,%eax,4) //调用了系统调度处理函数,eax存的是系统调用号,是实际的系统调度程序。
sys_call_table //系统调用分派表
syscall_after_all//保存返回值
sys_exit_work  //详见解释
restore all //恢复现场(因为系统调用也是一种特殊的“中断”)
INTERRUPT RETURN //也就是iret,系统调用到此结束
若有sys_exit_work,则进入sys_exit_work:会有一个进程调度时机。
work_pending -> work_notifysig,用来处理信号
可能call schedule:进程调度代码
可能跳转到restore_all,恢复现场。
若无sys_exit_work,就执行restore_all恢复,返回用户态。

 

以上是关于第五周:扒开系统调用的三层皮(下)的主要内容,如果未能解决你的问题,请参考以下文章

第五周:扒开系统调用的三层皮(下)

Linux内核及分析 第五周 扒开系统调用的三层皮(下)

20135201李辰希 《Linux内核分析》第五周 扒开系统调用的“三层皮”(下)

《Linux内核分析》 第五节 扒开系统调用的三层皮(下)

实验五:扒开系统调用的三层皮(下)

扒开系统调用的三层皮