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

标签 linux assembly operating-system linux-kernel x86

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/

相关文章:

linux - 为列表中的每个项目执行 bash 脚本

php - 使用 CPanel jailshell 在 PHP 中创建 Linux crontab

linux - Varnish 4 缓存年龄始终为零

c - 为什么我不能从这个 C 代码访问在汇编中声明的 Tss 变量?

linux - Linux内核中哪些内核线程负责发送网络数据包

linux - Unix 使用 grep 和 if

ios - PolarSSL 的 asm 代码在 iPad4 和模拟器中执行不同的结果

assembly - 我从哪里开始组装?

linux - RT Linux 内核是整体内核还是微内核(如 QNX)?

memory - I/O映射的I/O-端口地址是RAM的一部分