smw*_*dia 2 x86 exception interrupt interrupt-handling
我正在阅读英特尔手册 3A 第 6 章中断和异常处理。
\n\n中断和异常分别有3个来源。
\n\n对于软件生成的中断,它说:
\n\n\n\n\nINT n 指令允许通过提供中断向量号作为操作数从软件内部生成中断。例如,INT 35 指令强制隐式调用中断 35 的中断处理程序。从 0 到 255 的任何中断向量都可以用作该指令中的参数。然而,如果使用处理器 xe2x80x99 预定义的 NMI 向量,则处理器的响应将与以正常方式生成的 NMI 中断的响应不同。如果在此指令中使用向量号 2(NMI\n 向量),则会调用 NMI 中断处理程序,但不会激活处理器\xe2\x80\x99s NMI 处理硬件。\n 软件中生成的中断INT n 指令不能被 EFLAGS 寄存器中的 IF 标志屏蔽。
\n
对于软件生成的异常,它说:
\n\n\n\n\nINTO、INT 3 和 BOUND 指令允许在软件中生成异常。这些指令允许在指令流中的点处执行异常条件检查。例如,INT 3 会导致生成断点异常。INT\nn指令可用于模拟软件中的异常;但有一个限制。如果 INT n 为架构定义的异常之一提供向量,则处理器会生成正确向量的中断(以访问异常处理程序),但不会将错误代码推送到堆栈上。即使相关的硬件生成的异常通常会产生错误代码,情况也是如此。在处理异常时,异常处理程序仍会尝试从堆栈中弹出错误代码。由于没有推送错误代码,处理程序将弹出并丢弃 EIP(代替丢失的错误代码)。这会将返回值发送到错误的位置。
\n
那么,有什么区别呢?似乎都利用了int n
指令。如何判断一段汇编代码中是否产生异常或中断?
在 x86 架构中,异常被作为中断来处理,名义上是通过中断处理程序来处理的。
所以中断和异常是重叠的术语,后者是前者的一种。
中断号从0到31是为CPU异常保留的,例如中断号0是#DE(除法错误),中断号13是#GP(一般保护)。
当 CPU 检测到应引发异常的情况(例如访问不存在的页面)时,它会执行一系列任务。
首先,如果需要,它会推送错误代码,有些异常(如#PF 和#GP)会推送错误代码,有些(如#DE)则不会。Intel 手册 3
的第 6.15 节列出了所有异常及其最终错误代码。
其次,它“调用”适当的中断处理程序,这类似于远调用,但将EFLAGS压入堆栈。
int n
仅执行第二步,它调用中断但不推送任何错误代码,因为硬件中首先没有错误条件(并且因为在错误代码int n
的概念之前就存在)。
所以可以用来模拟
异常,软件最终必须推送适当的错误代码。
int n
当你在代码中看到时,它永远不会例外。它是一个中断,最终用于将控制流引导到特定的操作系统异常处理程序。
琐事:(int3
没有空格)很特殊,因为它被编码为CC
只有一个字节(正常int n
是CD imm8
)。这对于调试很有用,因为调试器可以将其放置在代码段中的任何位置。仅当OF = 1
into
时才生成 #OF 异常。
归档时间: |
|
查看次数: |
1431 次 |
最近记录: |