【问题标题】:Must IRET be used when returning from an interrupt?从中断返回时必须使用 IRET 吗?
【发布时间】:2012-05-14 19:51:56
【问题描述】:

IRET可以从堆栈中恢复寄存器,包括EFLAGS、ESP、EIP等,但我们也可以自己恢复所有寄存器。例如,“movl”可以用来恢复%esp寄存器,“jmp”可以跳转指向EIP的地址,该地址存储在堆栈中。

linux内核通过IRET从所有中断中返回,这是一个权重指令。

一些内核操作(如上下文切换)经常发生。

IRET不是浪费吗?

【问题讨论】:

  • 什么是“重量说明”?
  • 指令做了大量的工作,而且成本很高。

标签: linux assembly operating-system linux-kernel x86


【解决方案1】:

可能是因为手动执行所有这些操作需要更多的 CPU 时钟。

【讨论】:

    【解决方案2】:

    来自wikipedija

    发生中断时调用的实际代码称为 中断服务程序 (ISR)。当异常发生时,程序 调用中断,或硬件引发中断,则 处理器使用几种方法之一(待讨论)来传输 控制权交给 ISR,同时允许 ISR 安全地返回控制权 执行完成后中断的任何内容。至少, 保存 FLAGS 和 CS:IP 并加载 ISR 的 CS:IP;然而,有些 机制导致在 ISR 开始之前发生完整的任务切换 (以及结束时的另一个任务切换)。

    所以IRET 不是浪费,它是从 ISR 返回的最低限度(也是最快的方式)。此外,在 ISR 中使用的所有其他 CPU 寄存器必须在开始时保留并在IRET 执行之前恢复!

    【讨论】:

      【解决方案3】:

      除了IRET 可以而且经常应该做的所有繁重的事情之外,除了POPF+RETF 的简单混合之外,它还有一件事要做。它有一个与不可屏蔽中断NMIs)相关的特殊功能。

      并发的 NMI 会被一一交付给 CPU。 IRET 向 NMI 电路发出信号,表明现在可以提供另一个 NMI。没有其他指令可以发出这种信号。 如果 NMI 可以抢占其他 NMI ISR 的执行,它们将能够导致堆栈溢出,这很少是一件好事。除非我们谈论的是这个美妙的网站。 :)

      所以,总而言之,IRET 不是浪费。

      【讨论】:

      • 中断返回时是否只能使用IRET?
      • 在某些情况下,这是唯一的选择。 NMI 就是其中之一。如果您使用中断/异常任务,那是另一个。双重故障处理程序必须是任务。此外,IRET 对于将控制权转移到特权较低的代码(例如执行用户模式回调)非常有用。如果它在那里,为什么不使用它?
      • :"当 PIC 发送中断时,PIC 不会从同一源发送另一个中断,直到它通过 I/O 端口得到确认。"谁告诉当前的中断处理程序已经完成,IRET还是别的什么?
      • ISR 向 PIC 发送EOI(=中断结束)命令,然后执行 IRET。还有更多问题吗?让他们提问,而不是 cmets。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      • 2018-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多