为什么我们需要软件中断来开始执行系统调用?

时间:2014-10-03 16:57:16

标签: operating-system kernel system-calls

这可能是一个非常愚蠢的问题。 但是我想澄清我的怀疑,因为我是这个人的新手。

根据我的理解,CPU通过递增程序计数器逐步执行过程的指令。

现在假设我们有一个系统调用作为指令之一,那么为什么我们需要在遇到这条指令时给出软件中断?不能像执行其他指令那样执行此系统调用(指令序列),因为据我所知,中断是发出某些异步事件的信号。但是这里的系统调用是进程指令的一部分,它不是异步的。

2 个答案:

答案 0 :(得分:3)

它不会要求中断。您可以创建一个使用简单call的操作系统。但大多数人并不是出于好几个原因。其中可能是:

  1. 在许多架构中,中断提升或改变了CPU的访问级别,允许操作系统从非特权用户代码中实现对内存的保护。

  2. 抢占式操作系统已经使用中断来进行调度过程。使用相同的机制可能会很方便。

  3. 中断在大多数架构中都存在。替代方案可能需要跨架构进行重大的重新设计。

  4. 以下是"系统调用的一个示例"它没有使用中断(如果您将系统调用定义为从OS请求功能):

    较早版本的ARM不提供递增计数器的原子指令。这意味着原子增量需要操作系统的帮助。天真的方法是使它成为一个系统调用,使得该过程在加载 - 添加 - 存储指令期间不可中断,但这会产生很多来自中断处理程序的开销。相反,Linux内核选择将一小段代码映射到固定地址的每个进程。此代码包含原子增量指令,可以直接从用户代码调用。内核调度程序负责确保正确重新启动此块中断的任何操作。

答案 1 :(得分:0)

首先,系统调用是同步软件中断,而不是异步。当处理器执行陷阱机器指令进入内核空间时,一些内核寄存器会被中断处理程序函数改变。修改这些寄存器需要特权模式执行,即这些不能使用用户空间代码来改变。

当用户空间程序无法直接从磁盘读取数据时,因为它无法控制设备驱动程序。用户空间程序不应该打扰驱动程序代码。与设备驱动程序的通信应通过内核代码本身进行。我们倾向于认为内核代码是原始的,完全值得信赖的;用户代码总是令人怀疑。

因此,它需要特权指令来改变寄存器的内容和/或访问驱动器功能;用户不能将系统调用函数作为普通函数调用执行。您的处理器应该知道您是否处于内核模式以访问这些设备。

我希望这在某种程度上是明确的。