2019-2020-1 20199314 《Linux内核原理与分析》 第六周作业

深入认识系统调用systime_call

本周深入学习系统调用的机制。

系统调用的三层机制图如下。

一、MenuOS增加命令

先下载新的版本menu。在menu中含有rootfs脚本,make运行一下可以得根文件系统,操作步骤如图。

运行出的menuOS如图。

最新的menu中已经把上周做过的两个time函数给添加进去了。

运行后汇编和c语言文件实现的功能是一样的。

其实质就是在test.c文件中增加了前一周中的两个函数。

并且在代码中用两行语句对函数进行调用,如图。

二、gbd跟踪sys_time

这次启动linux-3.18.6内核,首先启动qemu。

在start_kernel处设置断点并list查看函数。

在sys_time处设置断点并list查看函数。接下来可以一直gdb s进入单步执行状态。但是实验楼环境下很容易就卡住。

三、系统调用的初始化

0x80和system_call是通过中断向量联系起来的。而systerm_call实际上就是一段汇编代码的入口。

xyz和sys_xyz是通过系统调用号联系起来的。

初始化从start_kernel函数开始,调用其中trap_init函数,再调用set_syster_trap_gate函数也正是由这个函数绑定0x80和system_cal。

四、systerm_call中断处理

systerm_call伪代码(从entry(systerm_call))开始。

sys_call_table查询系统调用号对应的函数,syscall_exit检查是否需要进入syscall_exit_work。

五、总结——整体内核处理过程示意图

syscall_exit_work需要跳转到work_pending,里面有work_notifysig处理信号,还有work_resched是需要重新调度,这里是进程调度的时机点call schedule,调度完之后就会跳转到restore_all恢复现场返回系统调用到用户态。

SAVE_ALL保存现场,中有syscall_call和sys_call_table。

call * sys_call_table(,%eax,4)调用系统调用的内核处理函数。

restore-all用于恢复现场。

INTERRUPT_RETURN用于返回系统调用到用户态结束。

posted @ 2019-10-27 15:21  20199314贺泽华  阅读(137)  评论(0编辑  收藏  举报