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

早过忘川 提交于 2020-02-24 07:03:44

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

                                                                                                        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之间的主要代码语句分析流程图,了解到了系统调用的流程。希望下次实验能够做的更好。

 

 

                            

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!