【发布时间】:2020-06-09 08:17:13
【问题描述】:
我已阅读有关中断例程的 AMD64 开发人员手册。根据说明书,
如果错误代码被中断或异常压入,中断处理程序必须将错误代码从堆栈中弹出。 IRET 将被中断程序的 rIP、CS 和 rFLAGS 从堆栈中弹出并放入各自的寄存器中,从而恢复被中断程序的 rIP、CS 和 rFLAGS。
因此,空的 ISR 处理程序是否会在此 ASM 代码中有所体现?
add rsp, 4 ;pop err code off stack
iretq
我假设错误代码的大小是 4 个字节,正如其他网站告诉我的那样。我很确定这是完全错误的,但一些指导会有所帮助。
【问题讨论】:
-
如果长模式(64 位)内核的错误代码不是完整的 8 字节,我会感到非常惊讶,保持内核堆栈 8 字节对齐。
-
64位模式下错误码为8字节。并非所有异常都有错误代码。您将不得不处理带有错误代码的异常与没有错误代码的异常略有不同。您可以在此处获取异常列表以及它们是否有错误代码:wiki.osdev.org/Exceptions。外部中断 (IRQ) 没有错误代码。
-
网站上的表格很有帮助,谢谢。 @MichaelPetch。没有错误代码的空处理程序是否只是
iretq而有错误代码的处理程序是add rsp, 8、iretq? -
正确,没有错误号意味着您只需执行
iretq即可返回。 -
非常感谢。如果你能做出这样的回答,那就太好了!
标签: exception assembly x86-64 interrupt interrupt-handling