1、为什么有系统调用这么东西。在设计者的角度,看操作系统负责管理计算机硬件,软件运行在硬件之上,那么谁控制了硬件谁就控制了计算机。所以操作系统需要提供维持自身存在的安全机制,避免恶意的代码,同时要对使用者提供操作硬件的能力。那么,极为必要的引入隔离措施之一,系统调用。
2、内核如何实现系统调用
main.c 中系统启动,调用了 sched_init() 方法,该方法调用 set_system_gate(0x80,&system_call),继而找到宏定义的函数_set_gate,其中_set_gate 中的 dpl 参数是 3,特权级 3 的门,是允许用户态代码调用。如下图。最终完成系统调用门的初始化。
系统调用的代码是使用汇编代码书写的,源码文件是 system_call.s,核心就一句 “call _sys_call_table(,%eax,4)”,调用了一个_sys_call_table 的表,入参是从 eax 寄存器中取的,长度 4。
sys_call_table 是个数组,在源码 sys.h 中。
初始化完成,剩下的就是如何系统调用。比如,linux 上的 fork 系统调用。
直接调用 fork(),那么在内核中的调用链路如下:
具体就不再赘述。
总结:
系统调用,有中断指令参与,中断有个表(数组),0x80 是中断表中系统调用的入口地址,入参是系统调用的下标。
备注:
系统调用涉及的底层知识。