《Linux内核分析》-- 扒开系统调用的三层皮(下)之system_call中断处理过程 20135311傅冬菁

20135311傅冬菁  原创作品 《Linux内核分析》MOOC课程

分析system_call中断处理过程

内容分析与总结:

系统调用在内核代码中的工作机制和初始化

系统调用在用户态中,用int $0x80与system_call()用中断向量联系起来,xyz和sys_xyz通过系统调用号联系起来的。

《Linux内核分析》-- 扒开系统调用的三层皮(下)之system_call中断处理过程  20135311傅冬菁

《Linux内核分析》-- 扒开系统调用的三层皮(下)之system_call中断处理过程  20135311傅冬菁

初始化:start_kernel里有一个trap_init();traps.c文件中,陷阱门陷函数有一个系统调用函数的入口。一旦执行int $0x80,CPU就自动跳转到System_call位置来执行。

《Linux内核分析》-- 扒开系统调用的三层皮(下)之system_call中断处理过程  20135311傅冬菁

ENTRY(system_call)就是我们执行int $0x80指令后跳转的位置。以上的代码就是系统调用的处理过程。

save all 用来处理保存现场和恢复现场的相关问题。

sys_call_table(系统调用表)记录了相关系统调用号的值。

syscall_after_call用来保存调用后的返回值。

注意的细节:

在系统调用返回之前可能会发生进程调度,即call schedule。可能需要处理当前进程的一些信号。

流程图:

《Linux内核分析》-- 扒开系统调用的三层皮(下)之system_call中断处理过程  20135311傅冬菁

总之,内核就是很多种中断处理过程的集合!

实验过程:

《Linux内核分析》-- 扒开系统调用的三层皮(下)之system_call中断处理过程  20135311傅冬菁

《Linux内核分析》-- 扒开系统调用的三层皮(下)之system_call中断处理过程  20135311傅冬菁

《Linux内核分析》-- 扒开系统调用的三层皮(下)之system_call中断处理过程  20135311傅冬菁

《Linux内核分析》-- 扒开系统调用的三层皮(下)之system_call中断处理过程  20135311傅冬菁

上一篇:Linux内核分析第五周学习总结——分析system_call中断处理过程


下一篇:作业五:分析system_call中断处理过程