《Linux内核分析》第五周学习总结

时间:2023-03-08 20:49:04

《Linux内核分析》第五周学习总结

                                 ——扒开系统调用的三层皮(下)

姓名:王玮怡 学号:20135116

1、给menuOS增加getpid和getid-asm命令

(1)进入实验楼环境,使用rm menu -rf指令强制删除已有的内核,使用git clone https://github.com/mengning/menu.git重新克隆一个最新的内核。

《Linux内核分析》第五周学习总结

(2)进入menu,找到test.c文件,将getpid和getpid-asm函数添加进去

《Linux内核分析》第五周学习总结

《Linux内核分析》第五周学习总结

修改主函数:

《Linux内核分析》第五周学习总结

(3)使用make rootfs,自动编译、生成根文件系统,并自动启动menuOS

《Linux内核分析》第五周学习总结

(4)使用help查看指令,并查看getpid和getpid-asm的运行结果

《Linux内核分析》第五周学习总结

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

《Linux内核分析》第五周学习总结

(1)将3.18内核带有的符号表加载进去:

《Linux内核分析》第五周学习总结

因为当前是在menu目录下,而所需要的镜像文件不在这个目录下,这时需要使用全路径,不然会显示找不到该文件。

(2)连接到MenuOS中:

《Linux内核分析》第五周学习总结

(3)设置断点,输入c继续执行到断点处:

《Linux内核分析》第五周学习总结

(4)在sys_time处设置一个断点(sys_time 为系统调用号13对应的内核处理函数),输入c继续执行:

《Linux内核分析》第五周学习总结

可以看出,time函数执行到sys_time处就停下了

(5)在gdb调试过程中,一直按n进行单步执行

(6)sys_time返回后进入汇编代码处理gdb无法继续跟踪

(7)在system_call处设置断点,仍然在sys_time处停下,不能在system_call处停止(因为system_call是一段汇编代码的起点)

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

(1)系统调用在内核代码中的工作机制和初始化

工作机制:

《Linux内核分析》第五周学习总结

初始化:

《Linux内核分析》第五周学习总结

(2)简化后便于理解的system_call伪代码

当出现 int $0x80指令,就会立即跳转到system_call位置:

《Linux内核分析》第五周学习总结

系统调用就是特殊的中断,也包括保存现场(SAVE ALL)和恢复现场(RESTORE ALL)

(3)分析system_call到iret的过程

《Linux内核分析》第五周学习总结

4、总结

  通过这周的学习我们知道了系统调用就是一个特殊一点的中断,所以也有保护现场与恢复现场。在这周的视频里,老师以系统时间调用为例,并对简化后的代码进行了解释说明。关于从system_call到iret的过程中,SAVE_ALL保存现场,call *sys_call_table(,%eax,4)调用了系统调度处理函数,eax存的是系统调用号,这段是实际的系统调度程序。INTERRUPT_RETURN,是一种宏,实际上就是iret,结束。这个过程中会有sys_exit_work,而sys_exit_work中包括了work_pending,其中还有work_notifysig,用来处理信号,此外还可能call schedule 进程调度代码,并且可能跳转到restore_all,恢复现场。