4

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

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

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

IRET不是浪费吗?

4

3 回答 3

9

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

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

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

于 2012-05-05T15:51:30.607 回答
0

可能是因为手动完成所有这些都需要更多的 CPU 时钟。

于 2012-05-05T14:44:22.067 回答
0

来自维基百科

发生中断时调用的实际代码称为中断服务程序 (ISR)。当异常发生、程序调用中断或硬件引发中断时,处理器使用几种方法之一(待讨论)将控制权转移给 ISR,同时允许 ISR 安全地将控制权返回给它之后中断的任何东西执行完毕。至少,保存 FLAGS 和 CS:IP 并加载 ISR 的 CS:IP;但是,某些机制会导致在 ISR 开始之前发生完整的任务切换(以及结束时的另一个任务切换)。

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

于 2012-05-05T14:56:58.957 回答