吕松鸿 + 原创作品转载请注明出处 + 《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恢复,返回用户态。
时间: 2024-10-22 18:55:59