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/