Linux linux0.11 系统调用原理

random 测试交流评论81字数 645阅读模式

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

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

文章源自玩技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 系统调用。

文章源自玩技e族-https://www.playezu.com/239484.html

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

文章源自玩技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
玩技站长微信
添加好友自动发送入群邀请
weinxin
rainbow-shownow
玩技官方公众号
官方微信公众号
weinxin
PLAYEZU
 
  • 版权提示:本站仅供存储任何法律责任由作者承担▷诈骗举报◁▷新闻不符◁▷我要投稿◁
    风险通知:非原创文章均为网络投稿真实性无法判断,侵权联系2523030730
    免责声明:内容来自用户上传发布或新闻客户端自媒体,切勿!切勿!切勿!添加联系方式以免受骗。
  • 原创转载:https://www.playezu.com/239484.html
    转载说明: 点我前往阅读>>>
匿名

发表评论

匿名网友
确定