2012-05-05 26 views
3

IRET可以从堆栈中恢复寄存器,包括EFLAGS,ESP,EIP等,但我们也可以自行恢复寄存器。例如,可以使用“movl”来恢复%esp寄存器,“jmp”可以跳转指向存储在堆栈上的EIP的地址。从中断返回时必须使用IRET吗?

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

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

IRET不是浪费吗?

+0

你是什么意思一个“体重指令”? –

+0

该指令做了很多工作,并且成本很高。 –

回答

9

除了所有笨重的东西IRET除了仅仅是POPF+RETF的混合之外,还可以并且经常应该做的是,它还有一件事情。它具有与不可屏蔽中断NMIs)相关的特殊功能。

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

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

+0

这是否意味着从中断返回时只能使用IRET? –

+0

在某些情况下,这是唯一的选择。 NMI是其中之一。如果你使用中断/异常任务,那是另一回事。双重故障处理程序必须是任务。此外,IRET对于将控制转移到权限较低的代码(例如执行用户模式回调)非常有用。如果它在那里,为什么不使用它? –

+0

:“当PIC发送中断时,PIC将不会从该源发送另一个中断,直到它通过I/O端口得到确认。”谁告诉当前的中断处理程序已经完成,IRET还是别的? –

0

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

0

wikipedija来自:

时发生了中断被称为 中断服务程序(ISR)时调用的实际代码。当异常发生时,程序 调用的中断,或硬件引发中断时, 处理器采用了多种方法(将要讨论),以 控制转移到ISR,同时允许ISR安全返回控制 到一个无论它在执行完成后中断。至少, FLAGS和CS:IP被保存,ISR的CS:IP被加载;然而,一些 机制会导致完全任务切换发生在ISR开始之前 (和另一个任务切换结束时)。

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

相关问题