IRET可以从堆栈中恢复寄存器,包括EFLAGS,ESP,EIP等,但我们也可以自己恢复寄存器。例如,“movl”可用于恢复%esp寄存器,“jmp”可以跳转指向存储在堆栈中的EIP的地址。
linux内核通过IRET从所有中断返回,这是一个权重指令。
一些内核操作(如上下文切换)经常发生。
IRET不是浪费吗?
答案 0 :(得分:9)
除了仅仅IRET
的混合之外,POPF+RETF
可以而且经常应该做的所有繁重的东西,还有另外一件事。它具有与不可屏蔽中断(NMIs
)相关的特殊功能。
并发NMI逐个传送到CPU。 IRET
向NMI电路发出信号,表明现在可以传送另一个NMI。没有其他指令可以做这个信号。
如果NMI可以抢占其他NMI ISR的执行,它们将能够导致堆栈溢出,这很少是一件好事。除非我们谈论这个精彩的网站。 :)
所以,总而言之,IRET
不是浪费。
答案 1 :(得分:0)
可能因为手动完成所有操作都需要更多的CPU时钟。
答案 2 :(得分:0)
来自wikipedija:
发生中断时调用的实际代码称为 中断服务程序(ISR)。发生异常时,程序 调用中断,或硬件引发中断, 处理器使用几种方法之一(待讨论)进行传输 控制ISR,同时允许ISR安全地返回控制 执行完成后中断的任何内容。至少, 保存FLAGS和CS:IP并加载ISR的CS:IP;但有些人 机制导致在ISR开始之前发生完整的任务切换 (以及结束时的另一个任务切换)。
所以IRET
不是浪费,它是从ISR返回的最小(也是最快的方式)。此外,ISR中使用的所有其他CPU寄存器必须在开始IRET
执行之前保留并恢复!