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