【问题标题】:How would an empty interrupt service handler be written in x64?如何在 x64 中编写一个空的中断服务处理程序?
【发布时间】: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, 8iretq
  • 正确,没有错误号意味着您只需执行iretq即可返回。
  • 非常感谢。如果你能做出这样的回答,那就太好了!

标签: exception assembly x86-64 interrupt interrupt-handling


【解决方案1】:

长模式 (x64) 中的错误代码大小为 8 字节长。因此,您需要添加 8 个字节,而不是向堆栈指针添加 4 个字节。

此外,并非所有异常都会将错误代码推入堆栈。可以在此处找到包含哪些例外情况和哪些例外情况的表格:https://wiki.osdev.org/Exceptions

如果处理程序不推送错误代码,则空处理程序只是从处理程序返回的iretq 指令。如果它确实推送了错误代码,我们只需将 8 个字节添加到堆栈指针,然后从处理程序返回。

add rsp, 8
iretq

感谢@MichaelPetch

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-13
    • 2012-12-13
    • 2020-12-09
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    相关资源
    最近更新 更多