【问题标题】:how does the processor know an instruction is making a system call处理器如何知道一条指令正在进行系统调用
【发布时间】:2012-08-26 23:03:04
【问题描述】:

系统调用——它是一条产生中断的指令,导致操作系统获得 处理器的控制。

因此,如果正在运行的进程发出系统调用(例如创建/终止/读取/写入等),则会生成一个中断,导致内核控制处理器,然后执行所需的中断处理程序例程。对吗?

那么谁能告诉我处理器是如何知道这条指令应该阻塞进程、进入特权模式并带来内核代码的。

我的意思是,作为一名程序员,我只需键入 stream1=system.io.readfile(ABC) 或其他内容,即打开并读取文件 ABC。

现在是什么监控这个进程的执行,cpu里有什么神通可以检测到这个吗?

根据我的阅读,PROCESSOR 一次只能执行一个进程,那么监视器程序在哪里运行?

当系统不在运行状态时,内核如何监控是否进行了系统调用!!

或者计算机是否有一个系统调用指令表,在执行任何指令之前它会与它进行比较?

请帮忙

谢谢

【问题讨论】:

    标签: operating-system kernel system-calls processor


    【解决方案1】:

    内核不监视进程以检测系统调用。相反,该进程会生成一个中断,将控制权转移给内核,因为根据指令集参考手册,软件生成的中断就是这样做的。

    例如,在 Unix 上,进程将系统调用号填充到 eax 中并运行 int 0x80 指令,该指令生成中断 0x80。 CPU 通过查看Interrupt Descriptor Table 以找到内核的中断处理程序来对此做出反应。这个处理程序系统调用的入口点。

    所以,在 32 位 x86 Linux 中调用 _exit(0)(原始系统调用,而不是刷新缓冲区的 glibc exit() 函数):

    movl  $1, %eax   # The system-call number.  __NR_exit is 1 for 32-bit
    xor   %ebx,%ebx  # put the arg (exit status) in ebx
    int   $0x80
    

    【讨论】:

    • 好的,那么请解释一下你所说的“调用中断 0x80”是什么意思,我的理解是通过使处理器的中断线高/低来产生中断,在结束时检查每个时钟周期。所以请为初学者解释一下。谢谢
    • 我知道 int $0x80 是用于调用中断的十六进制代码,但是你能详细解释一下当这条线编译到机器级别时发生了什么吗?
    • 大多数现代 unix 应该使用“sysenter”,而不是 int 0x80
    • @strkol 实际上在 linux 上这是通过 vdso 动态处理的。它如何选择 int 0x80 /​​ sysenter 真的很有趣。
    • @cnicutar,似乎sysenter仅用于clock_gettime/gettimeofday/getcpu/time系统调用(在arch/x86/vdso/vdso.lds.S中定义)
    【解决方案2】:

    让我们分析您提出的每个问题。

    1. 是的,你的理解是正确的。

    2. 看,如果任何进程/线程想要进入内核,只有两种机制,一种是通过执行 TRAP 机器指令,另一种是通过中断。通常中断是由硬件生成的,因此任何其他进程/线程想要进入内核它都会通过 TRAP。因此,像往常一样,当进程执行 TRAP 时,它会向内核发出中断(主要是软件中断)。除了陷阱,您还将提到系统调用号,它作为内核内部中断处理程序的输入。根据系统调用号,您的内核在系统调用表中找到系统调用函数并开始执行该函数。当内核开始处理中断时,内核将在 cs 寄存器中设置模式位以提示处理器,因为当前指令是特权指令。这样,您的处理器将知道当前指令是否具有特权。一旦你的系统调用函数完成它的执行,你的内核将执行 IRET 指令。这将清除 CS 寄存器中的模式位,以告知从现在开始向内的任何指令来自用户模式。

    3. 处理器内部没有神奇的力量,在用户和内核上下文之间切换让我们认为处理器是一个神奇的东西。它只是一个硬件,能够以非常高的速率执行大量指令。

    4..5..6。所有这些问题的答案都在上述案例中得到了解答。

    希望我在一定程度上回答了你的问题。

    【讨论】:

      【解决方案3】:

      中断控制器向 CPU 发出中断发生的信号,传递中断号(因为中断被分配了处理同时中断的优先级)因此中断号来确定要启动的处理程序。 CPU 跳转到中断处理程序,当中断完成后,程序状态重新加载并恢复。

      [参考:Silberchatz,操作系统概念第 8 版]

      【讨论】:

        【解决方案4】:

        您正在寻找的是mode bit。基本上有一个名为cs register 的寄存器。通常它的值设置为 3(用户模式)。对于特权指令,内核将其值设置为 0。查看该值,处理器就知道它是哪种指令。如果您有兴趣挖掘更多内容,请参考excellent article

        其他参考

        Where is mode bit

        【讨论】:

          【解决方案5】:

          现代硬件支持多个用户会话。如果您的硬件支持多用户模式,我提供了一种称为中断的机制。中断基本上停止执行当前代码以执行其他代码(例如内核代码)。 执行哪个代码由传递给中断的参数决定,由发出中断的代码决定。 hw 会增加运行级别,将内核代码加载到内存中并强制 cpu 执行此代码。当内核代码返回时,它再次直接通知硬件,运行级别降低。 然后,硬件将恢复中断前的 cpu 状态,并将 cpu 设置为启动中断的代码的下一行。完毕。 由于代码在主动调用硬件,而硬件又主动调用内核,因此内核本身无需进行任何监控。

          旁注: 尽量让你的问题简短。明确你想要什么。第一个答案对于您发布的问题是正确的,只是您没有很好地表达它。明确说明您是该主题的新手,需要对基本概念进行详细解释,而不是解释您目前所理解的内容并且不要使用大写锁定。

          请接受 cnicutar 提供的答案。谢谢。

          【讨论】:

          • 几乎任何类似 CPU 的东西,即使是最小的微控制器,都将支持某种硬件中断,无论是否存在权限分离(内核与用户)。这个问题是关于软件生成的中断以同步运行一些内核代码。 (作为系统调用)。这似乎是一个糟糕的解释,如果它甚至可以解释正确的事情的话。
          猜你喜欢
          • 2013-09-11
          • 1970-01-01
          • 2021-10-04
          • 1970-01-01
          • 2014-06-20
          • 1970-01-01
          • 2014-09-25
          • 2011-01-24
          • 2011-02-11
          相关资源
          最近更新 更多