从中断返回时必须使用IRET吗?

时间:2012-05-05 14:39:13

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

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

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

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

IRET不是浪费吗?

3 个答案:

答案 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执行之前保留并恢复!