Linux linux0.11 系统调用原理

random 测试交流评论126字数 436阅读1分27秒阅读模式

1、为什么有系统调用这么东西。在设计者的角度,看操作系统负责管理计算机硬件,软件运行在硬件之上,那么谁控制了硬件谁就控制了计算机。所以操作系统需要提供维持自身存在的安全机制,避免恶意的代码,同时要对使用者提供操作硬件的能力。那么,极为必要的引入隔离措施之一,系统调用。

2、内核如何实现系统调用
main.c 中系统启动,调用了 sched_init() 方法,该方法调用 set_system_gate(0x80,&system_call),继而找到宏定义的函数_set_gate,其中_set_gate 中的 dpl 参数是 3,特权级 3 的门,是允许用户态代码调用。如下图。最终完成系统调用门的初始化。

Linux
 linux0.11 系统调用原理插图
文章源自玩技e族-https://www.playezu.com/239484.html

系统调用的代码是使用汇编代码书写的,源码文件是 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 系统调用。

Linux
 linux0.11 系统调用原理插图1
文章源自玩技e族-https://www.playezu.com/239484.html

直接调用 fork(),那么在内核中的调用链路如下:

Linux
 linux0.11 系统调用原理插图2
文章源自玩技e族-https://www.playezu.com/239484.html

具体就不再赘述。文章源自玩技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 文件原理
文章源自玩技e族-https://www.playezu.com/239484.html文章源自玩技e族-https://www.playezu.com/239484.html
 
匿名

发表评论

匿名网友
确定

拖动滑块以完成验证