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。文章源自玩技e族-https://www.playezu.com/239484.html
sys_call_table 是个数组,在源码 sys.h 中。文章源自玩技e族-https://www.playezu.com/239484.html
初始化完成,剩下的就是如何系统调用。比如,linux 上的 fork 系统调用。
直接调用 fork(),那么在内核中的调用链路如下:
具体就不再赘述。文章源自玩技e族-https://www.playezu.com/239484.html
总结:
系统调用,有中断指令参与,中断有个表(数组),0x80 是中断表中系统调用的入口地址,入参是系统调用的下标。文章源自玩技e族-https://www.playezu.com/239484.html
备注:
系统调用涉及的底层知识。文章源自玩技e族-https://www.playezu.com/239484.html
- CPU 和内存在代码段、数据段、栈的权限控制体系
- 寄存器相关
- intel 的 call 和 reset 指令原理、intel 中断原理
- 栈相关
- ELF 文件原理