为什么使用中断处理系统调用?

she*_*eru 3 kernel interrupt system-calls

我有一个关于linux系统调用的基本问题.
为什么系统调用不像普通函数调用那样处理,为什么通过软件中断处理?
是因为在用户应用程序的构建过程中没有为内核用户空间应用程序执行链接过程吗?

Ale*_*nze 5

单独编译的代码片段之间的链接是一个小问题.共享库已经有很长时间的解决方法(可重定位代码,导出表等).在程序中加载库时,通常只需支付一次成本.

更大的问题是您需要将CPU从非特权的用户模式切换到特权的内核模式,并且您需要以可控的方式执行它,而不会让用户代码逃脱并破坏内核的破坏.而这通常是通过特殊或指定的指令完成的.转换到内核时,您也可能受益于自动中断禁用,x86 int指令可以为您执行此操作.大多数CPU都有类似这样的指令,这是实现系统调用接口的常用方法,尽管不是唯一的方法.

如果你问过MS-DOS或原始的MINIX,它们都是以真实地址模式在i8086上运行,内核无法保护自己或其他任何程序,因为所有代码都可以访问所有内存和系统资源那么使用特殊指令的理由就更少,例如int,没有两种模式,只有一种,在这方面int大致等同于简单call (far).

另外值得注意的是,CPU通常以非常类似的方式处理以下3种类型的事件:

  • 来自I/O设备的硬件中断
  • 异常,代码执行中的错误(例如,除以0,页面错误等)
  • 系统调用

这使得使用像int指令这样的东西是一个自然的选择,因为你在所有上述处理程序中的入口和出口点如果不完全那么大致相同.