【问题标题】:Is there a system call service routine in the interrupt vector?中断向量中有系统调用服务程序吗?
【发布时间】:2015-06-21 18:18:21
【问题描述】:

我对系统调用感到困惑。

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

系统调用是否也存储在函数指针向量中?像这张照片所示?

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

引自 Silberschatz Operating Systems Concepts:

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

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

【问题讨论】:

    标签: linux operating-system interrupt system-calls


    【解决方案1】:

    (以独立于硬件的方式进行泛化)

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

    INT #100
    

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

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

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

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

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

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

    如上所述,NO。您不必调用系统服务例程来触发内核模式系统服务。但是,大多数时候您这样做是为了方便。

    那么为什么有可能添加您自己的系统调用而没有可能添加您自己的中断处理程序?

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

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

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

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

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

    【讨论】:

    • 在 x86 架构上,中断向量表包含 256 个中断处理程序link。其中 32 个由 Intel 保留,OS 可以使用其他的。 Linux/OS X 有超过 224 个系统调用(我们可以在 中看到),这意味着操作系统有一个单独的中断和系统服务向量,对吧?你是什​​么意思没有系统调用服务例程?你写过“你不必调用系统服务例程来触发内核模式系统服务,但你这样做是为了方便”,这是什么意思?
    • 您已经写过,在许多系统上,中断向量和系统调用向量是相同的。在这样的系统中,系统定义了固定数量的中断和异常。所以数字是固定的,不能改变,对吧?如果是这样,我如何添加自己的系统调用?哪个操作系统有单独的中断/系统调用向量,哪个只有一个?
    • 英特尔是一个真正的怪人。操作系统有多种机制来实现系统服务。使用中断方式,所有系统服务只使用一个中断向量是正常的。实际的系统服务由寄存器中设置的值标识。还有 SYSCALL/SYSENTER 方法。这是做同样事情的一种更快的方法。系统服务由一个寄存器(通常是 EAX)标识。
    猜你喜欢
    • 2012-03-30
    • 2015-11-22
    • 1970-01-01
    • 2021-09-19
    • 2015-01-09
    • 2018-06-11
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多