第一部分
使用gdb跟踪分析一个系统调用内核函数
图1 在menuOs中添加pid和pidasm菜单选项后使用dgb跟踪,设置断点sys_getpid
图2 sys_getpid返回后进入汇编代码处理无法使用dgb继续跟踪
第二部分
图3 系统调用处理过程的汇编伪代码
分析:可以从简化的伪代码理解system_call开始到iret结束之间的整个过程。
首先是定义的各种宏INTERRUPT_RETURN(iret)、SAVE_ALL、RESTORE_INT_REGS
然后进入系统调用首先SAVE_ALL,查找系统调用表后调用相应的调用函数,exit时会判断当前的任务是不是要进行syscall_exit_work,如果不需要处理就restore_all,然后irq_return就结束了。若有sys_exit_work,则进入sys_exit_work,可能会有一个进程调度时机,可能会发生进程上下文切换。
图4 流程图
第三部分
和上周实验相比,本周更深入的跟踪和分析了系统调用从system_call到iret之间的处理过程。当系统调用发生时,内核处理系统调用服务,结束返回时回到用户态之前可能发生进程调度。内核可以抽象成不同种类的中断的集合。
小市民 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000