提问人:Akib Azmain Turja 提问时间:6/26/2021 最后编辑:Akib Azmain Turja 更新时间:6/28/2021 访问量:226
在“sti”之后执行“ret”不会启动中断
Executing "ret" after "sti" doesn't start interrupts
问:
我正在开发一个微内核。在我的内核中,有一个启用外部中断的函数。但它不起作用。然后我意识到导致问题的指令是后跟的。英特尔软件开发人员手册 说:sti
ret
如果 IF = 0,则在执行 STI 后,指令边界上的可屏蔽硬件中断仍处于抑制状态。(提供此指令的延迟效果是为了允许在从过程或子例程返回之前启用中断。例如,如果 STI 指令后跟 RET 指令,则允许 RET 指令在识别外部中断之前执行。如果 CLI 的执行紧随 STI 的执行,则无法识别中断。抑制在传递另一个事件(例如,异常)或执行下一个指令后结束。
因此,应该在指令之后启用中断,但这不会发生。IF in eflags 在集合中,但没有外部中断。如果我在 和 之间放置一条指令,一切正常。ret
nop
sti
ret
最小可重复示例:
asm volatile ("call 1f;"
"jmp 2f;"
"1:"
"sti;"
// "nop;"
"ret;"
"2:");
取消注释,中断将被启用。此外,如果我在上面的后面放置以下行之一,则会中断工作:nop
asm volatile ("jecxz 1f; 1:");
asm volatile ("pushf; popf");
注意:我正在使用 QEMU 来运行我的内核。
答: 暂无答案
评论
pushf
ret
iret
ret
ret