扒开系统调用的三层皮(下)
扒开系统调用的三层皮(下)
20135109 高艺桐
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
一、给MenuOS增加time和time-asm命令
自己实验截图:
(1)进入实验楼环境,使用rm menu -rf指令强制删除已有的内核,使用git clone https://github.com/mengning/menu.git重新克隆一个最新的内核。
(2)进入menu,找到test.c文件,将getpid和getpid-asm函数添加进去
(3)修改主函数
(4)使用make rootfs,自动编译、生成根文件系统,并自动启动menuOS
(5)使用help查看指令,并查看getpid和getpid-asm的运行结果
给MenuOS增加time和tim-asm命令的步骤:
- 更新meun代码到最新版
- 在main函数中增加MenuConfig
- 增加对应的Time函数和TimeAsm函数
- Make rootfs
二、使用gdb跟踪系统调用内核函数sys_time
自己实验截图:
(1)将3.18内核带有的符号表加载进去:
(2)设置断点,输入c继续执行到断点处:
(3)在sys_time处设置一个断点(sys_time 为系统调用号13对应的内核处理函数),输入c继续执行:
(4)如果我们执行time命令的话,会停在sys_time这个位置
(5)在gdb调试过程中,一直按n进行单步执行
(6)sys_time返回后进入汇编代码处理gdb无法继续跟踪
(7)在system_call处设置断点,仍然在sys_time处停下,不能在system_call处停止(因为system_call是一段汇编代码的起点)
三、系统调用在内核代码中的处理过程`
3、1系统调用在内核代码中的工作机制和初始化
分析图示:
系统调用xyz()用int 0x80这个中断向量,对应system_call(初始化时通过中断向量绑定0x80)。
分析图示:
系统调用机制的初始化:
Start_kernel中的trap_init()中的set_system_trap_gate中的系统调用中断向量和系统调用的汇编入口,一旦执行0x80,系统自动跳转到system_call来执行。
3、2简化后便于理解的system_call伪代码
(1)system_call到iret之间的主要代码语句分析流程图
(2)系统调用的处理过程简化代码重要语句分析:
- save_all保存现场
- sys_call_table调用系统调用对应的处理函数
- syscall_exit_work判断当前任务是不是需要处理
- work_pending需要处理信号(work_notifysig)
- work_resches需要重新调度
- 调度的过程中可能发生中断上下文的切换和进程上下文的切换
- 内核:很多种中断处理上下文的集合
3、3简单浏览system_call到iret之间的主要代码
简单浏览system_call到iret之间重要语句分析:
- save_all保存现场
- sys_call_table调用系统调用对应的处理函数
- work_pending需要处理信号(work_notifysig)
- call schedule(决定进程调度的代码都在schedule中)
- restore all恢复现场
- INTERRMPT RETURN系统调用结束
四、实验总结
通过本次实验,我了解到了给MenuOS增加time和time-asm命令,首先更新meun代码到最新版,其次在main函数中增加MenuConfig函数,之后添加上次实验的Time函数和TimeAsm函数,最后Make rootfs。也自己完成了gbp的调试实验,最后画出了system_call到iret之间的主要代码语句分析流程图,了解到了系统调用的流程。希望下次实验能够做的更好。