3

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

4

1 回答 1

5

单独编译的代码片段之间的链接是一个小问题。共享库已经有很长一段时间了(可重定位代码、导出表等)。当您在程序中加载库时,您通常只需支付一次费用。

更大的问题是您需要将 CPU 从非特权用户模式切换到特权内核模式,并且您需要以可控的方式进行操作,而不会让用户代码逃逸并对内核造成严重破坏。这通常是通过特殊或指定的指令来完成的。您还可以从转换到内核时的自动中断禁用中受益,x86int指令可以为您做这件事。大多数 CPU 都有类似这条指令的东西,它是实现系统调用接口的常用方法,尽管不是唯一的。

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

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

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

这使得使用类似int指令的东西成为一个自然的选择,因为您在上述所有处理程序中的入口和出口点如果不完全相同,那么基本上是相同的。

于 2013-03-21T00:15:46.060 回答