【问题标题】:Where to return from an interrupt从中断返回到哪里
【发布时间】:2012-02-28 07:03:08
【问题描述】:

我已阅读(并研究过)有关中断处理的内容。
我一直无法理解的是,我们如何知道从中断处理程序返回到(PC / IP)的位置。
据我了解:

  1. 中断是由设备(比如键盘)引起的
  2. 在运行进程下调用相关处理程序。也就是说,不执行到 OS 的上下文切换。
  3. 中断处理程序完成,并将控制权交还给正在运行的应用程序。

上面描述的过程,这是我对中断处理的理解,发生在当前运行进程的上下文中。所以它类似于方法调用,而不是上下文切换。
但是,由于我们实际上并未调用中断处理程序,因此我们没有机会将当前 IP 推入堆栈。
那么我们如何知道从中断中跳回的位置。我很困惑。

希望有任何解释,包括简单地指出一个很好的 pdf/ppt 专门解决这个问题的单行词。
[我一般是指Linux和C代码下的上述过程-但欢迎所有好的答案]

【问题讨论】:

  • 有点迂腐,但上面的第 (2) 点并不是这么说的。在中断时,核心肯定会在 ring 0 内核代码中切换到“操作系统”。内核可以在不更改 CR3 页表指针的情况下处理中断,因此从这个意义上说,没有上下文切换。由于这个原因,用户进程都映射了全局内核页表。
  • @srking:我会重新变得迂腐 - 很明显,处理程序已在操作系统中注册。同样在任何正常情况下,处理程序本身都将位于内核地址空间中。但是,正在运行的进程将继续运行 - 所以是的,没有上下文切换。此外,任何花费的 CPU 周期都将计入该进程的计费。

标签: operating-system interrupt interrupt-handling context-switch


【解决方案1】:

它非常依赖于架构。

在 Intel 处理器上,当中断发生时,中断返回地址被压入堆栈。您将使用iret 指令从中断上下文返回。

在 ARM 上,中断会导致处理器模式更改(例如更改为 INTFIQSVC 模式),将当前 CPSR(当前程序状态寄存器)保存到 SPSR(已保存程序状态寄存器),将当前执行地址放入新模式的LR(链接寄存器),然后跳转到相应的中断向量。因此,从中断返回是通过将 SPSR 移动到 CPSR 中然后跳转到保存在 LR 中的地址来完成的——通常使用 subsmovs 指令一步完成:

movs pc, lr

【讨论】:

    【解决方案2】:

    当一个中断被触发时,CPU 会将几个寄存器压入堆栈,包括中断前正在执行的代码的指令指针 (EIP)。您可以将iret 和 ISR 末尾的值弹出这些值,并恢复 EIP(以及 CS、EFLAGS、SS 和 ESP)。

    顺便说一下,中断不一定由设备触发。在 Linux 和 DOS 中,用户空间程序使用中断(通过int)进行系统调用。一些内核代码使用中断,例如故意三重故障以强制关闭。

    【讨论】:

    • 在英特尔上,是的。不过,不在任何其他架构上。
    【解决方案3】:

    CPU 中的中断触发机制将返回地址压入堆栈(除其他外)。

    【讨论】:

    • 嗯,这完全取决于系统。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 2019-06-08
    • 1970-01-01
    • 2016-10-20
    • 2021-04-08
    • 1970-01-01
    相关资源
    最近更新 更多