我对linux系统调用有一个基本的问题 为什么系统调用不像普通函数调用那样处理,为什么通过软件中断处理? 是因为在用户应用程序的构建过程中没有为内核的用户空间应用程序执行链接过程吗?
答案 0 :(得分:5)
单独编译的代码片段之间的链接是一个小问题。共享库已经有很长时间的解决方法(可重定位代码,导出表等)。在程序中加载库时,通常只需支付一次费用。
更大的问题是你需要将CPU从无特权的用户模式切换到特权的内核模式,你需要以可控的方式进行,而不会让用户代码逃脱并破坏内核的破坏。而这通常是通过特殊或指定的指令完成的。转换到内核时,您也可以从自动中断禁用中受益,x86 int
指令可以为您执行此操作。大多数CPU都有类似这样的指令,这是实现系统调用接口的常用方法,尽管不是唯一的。
如果你问过MS-DOS或原版MINIX,它们都是在真实地址模式下在i8086上运行的,内核无法保护自己或其他任何程序,因为所有的内存和系统资源都是可访问的对于所有代码,那么使用像int
这样的特殊指令的理由就更少了,没有两种模式,只有一种,在这方面,int
在很大程度上等同于一个简单的{{1} }}
同样值得注意的是,CPU经常以非常类似的方式处理以下3种类型的事件:
这使得使用像call (far)
指令这样的东西是一个很自然的选择,因为所有上述处理程序中的入口和出口点如果不完全那么大致相同。