中断向量中是否有系统调用服务程序?

时间:2015-04-15 16:48:52

标签: linux operating-system interrupt system-calls

我对系统调用感到困惑。

问题是:是否存在系统调用服务例程,它总是被调用,以便找到特定的系统调用,如写入,读取等?

系统调用是否也存储在函数指针的向量中?如图所示?

syscall table

如果是这样,为什么有可能添加自己的系统调用,并且不可能添加自己的中断处理程序?为什么中断向量是固定大小而系统调用向量不是?

引自Silberschatz操作系统概念:

  

系统调用通常采用陷阱的形式到中断向量中的特定位置。虽然某些系统(如MIPS)具有调用系统调用的特定系统调用指令,但此陷阱可以由通用陷阱指令执行。

     

执行系统调用时,硬件通常会将其视为软件中断。控制将中断向量传递给操作系统中的服务例程,并将模式位设置为内核模式。 系统调用服务例程是操作系统的一部分。内核检查中断指令以确定发生了什么系统调用;参数指示用户程序正在请求的服务类型。请求所需的附加信息可以在寄存器,堆栈或内存中传递(指向寄存器中传递的存储器位置)。内核验证参数是否正确和合法,执行请求,并将控制权返回给系统调用后的指令。

1 个答案:

答案 0 :(得分:3)

(以硬件独立方式推广)

系统调用的工作方式是执行类似

的指令
INT #100

(这里的我的INT指令是你引用中描述的陷阱)。

明确触发异常/中断#100。然后,CPU在中断向量中查找条目#100,然后在内核模式下调用该例程。

与许多系统一样,我假设中断向量和系统调用向量是相同的。在这样的系统中,系统定义了固定数量的中断和异常。操作系统可以在系统定义的向量之上添加其他向量。

这是触发机制。在到达状态之前,系统服务将期望寄存器和堆栈处于定义的状态(例如,传递缓冲区和缓冲区大小)。所有这些都需要汇编语言。

因此,大多数系统都有包装函数,您可以像调用参数,将它们放入寄存器,设置堆栈(可能),触发中断,从寄存器读取返回值,更新参数的函数调用并返回给来电者。甚至汇编语言程序员也倾向于使用这些包装器。

  

问题是:是否存在系统调用服务例程,它总是被调用,以便找到特定的系统调用,如写入,读取等?

如上所述,NO。您不必调用系统服务例程来触发内核模式系统服务。但是,大部分时间都是出于方便的原因。

  

为什么有可能添加自己的系统调用,并且不可能添加自己的中断处理程序?

硬件异常和中断由。 。 。 。硬件。他们是固定的。

  

为什么中断向量是固定大小而系统调用向量不是?

您似乎指的是具有单独的中断向量和系统服务向量的系统。大多数(但不是全部)系统将它们组合在一起。 CPU识别的中断和异常的数量是固定的,并在硬件中定义。操作系统可以定义任意数量的系统服务。

如果系统为每个类都有单独的向量,则硬件向量是固定的,系统调用向量可以是任何大小,以说明不同操作系统可以提供的无数系统服务集。

如果系统有一个向量,则硬件处理程序首先出现,并且通常会跟随任何数量的软件系统服务。将有一个定义向量长度的寄存器。