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

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

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

IRET 不是浪费吗?

最佳答案

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

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

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

关于linux - 从中断返回时必须使用 IRET 吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10462884/

10-11 19:06