Linux linux0.11 系统调用原理

润安 · 2022年09月10日 · 3026 次阅读

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 是中断表中系统调用的入口地址,入参是系统调用的下标。

备注:
系统调用涉及的底层知识。

  • CPU 和内存在代码段、数据段、栈的权限控制体系
  • 寄存器相关
  • intel 的 call 和 reset 指令原理、intel 中断原理
  • 栈相关
  • ELF 文件原理
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册