码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-03-27 21:26:06      阅读:266      评论:0      收藏:0      [点我收藏+]

标签:

吕松鸿 + 原创作品转载请注明出处 + 《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恢复,返回用户态。

 

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

标签:

原文地址:http://www.cnblogs.com/lv-20135229/p/5326626.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!