本周学习了庖丁解牛Linux内核分析第五章:系统调用的三层机制(下),是上一章的延续

实验内容:使用gdb跟踪分析一个系统调用内核函数

上周实验我选择的getpid这个系统系统调用,这次准备使用gdb跟着系统调用内核函数sys_getpid

先更新一下menu文件夹

然后修改一下test.c,把上周写的两个关于getpid系统调用的函数加入,并在main里声明

然后进行编译

编译完成后,输入help,可以看到,menuos多了两个命令pid和pid-asm

接下来要开始跟踪系统调用函数sys_getpid,首先先用qemu启动内核,并让其处于初始暂停状态

另一个shell里输入gdb命令,进入gdb后,建立和menuos的调试连接

然后分别在start_kernel和sys_getpid处设置断点,并输入c继续执行

实验楼的虚拟机环境每次执行到这一步都卡住了,实在没有办法,我就只能用书来对system_call汇编代码进行简单分析

system_call汇编代码分析

ENTRY(system_call)
RINGO_INT_FRAME
ASM_CLAC
push1_cfi %eax /*保存系统调用号*/
SAVE_ALL /*保存现场,将用到的所有CPU寄存器保存到栈中*/
GET_THREAD_INFO(%ebp) /*ebp用于存放当前进程thread_info结构的地址*/
test1 $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp)
jnz syscall_trace_entry
cmp1 $(nr_syscalls),%eax /*检查系统调用号(系统调用号应小于NR_syscalls)*/
jae syscall_badsys /*不合法,跳入异常处理*/
syscall_call:
call *sys_call_table(,%eax,4) /*合法,对照系统调用号在系统调用表中寻找相应的系统调用的内核处理函数*/
movl %eax,PT_EAX(%esp)/*保存返回值到栈中*/
syscall_exit:
testl $_TIF_ALLWORK_MASK, %ecx/*检查是否需要处理信号*/
jne syscall_exit_work /*需要,进入 syscall_exit_work*/
restore_all:
TRACE_IRQS_IRET /*不需要,执行restore_all恢复,返回用户态*/
irq_return:
INTERRUPT_RETURN /*相当于iret*/

system_call流程示意图

最新文章

  1. springMVC中实现servlet依赖注入
  2. 【视频教程】使用UIAutomation开发软件外挂
  3. Atitit jsr规范化分类 attilax总结
  4. MATLAB函数freqz()
  5. mouseover,mouseout,mouseenter,mouseleave的区别
  6. EMVTag系列14《支付环境响应数据》
  7. memcached全面剖析--4
  8. ASP.NET MVC5总结(四)登陆中常用技术解析之验证码
  9. VS 2012中消失了的Create UnitTest
  10. 基于Keepalvied的Mysql主主漂移(切换)
  11. 【洛谷P1082】同余方程
  12. X-factor Chains [POJ3421] [素数]
  13. Django深度剖析-二
  14. Failed while changing version of Java to 1.8.
  15. 异步加载script,提高前端性能(defer和async属性的区别)
  16. 1.4isAlive()方法
  17. Android 编程下 Canvas and Drawables
  18. linux中chmod与chown两个命令详解
  19. Liferay portlet首选项(preferences)设置、存储处理
  20. WinFrom饼形图

热门文章

  1. 记一次Windb死锁排查
  2. STM32F103ZET6窗口看门狗
  3. 创建一个tar备份包
  4. centos 64位安装jpeg-6b
  5. 关于微信小程序的一点经验
  6. python工业互联网监控项目实战2—OPC
  7. Dubbo 路由机制的实现
  8. android性能测试--CPU、内存
  9. http的请求头都有那些信息
  10. 事务的传播属性及隔离级别 Spring