《Linux内核分析》-- 扒开系统调用的三层皮(下)之system_call中断处理过程 20135311傅冬菁
20135311傅冬菁 原创作品 《Linux内核分析》MOOC课程
分析system_call中断处理过程
内容分析与总结:
系统调用在内核代码中的工作机制和初始化
系统调用在用户态中,用int $0x80与system_call()用中断向量联系起来,xyz和sys_xyz通过系统调用号联系起来的。
初始化:start_kernel里有一个trap_init();traps.c文件中,陷阱门陷函数有一个系统调用函数的入口。一旦执行int $0x80,CPU就自动跳转到System_call位置来执行。
ENTRY(system_call)就是我们执行int $0x80指令后跳转的位置。以上的代码就是系统调用的处理过程。
save all 用来处理保存现场和恢复现场的相关问题。
sys_call_table(系统调用表)记录了相关系统调用号的值。
syscall_after_call用来保存调用后的返回值。
注意的细节:
在系统调用返回之前可能会发生进程调度,即call schedule。可能需要处理当前进程的一些信号。
流程图:
总之,内核就是很多种中断处理过程的集合!
实验过程: