我最近开始学习中断,但我觉得我错过了一些重要的东西。
我知道当发生异常类型中断时,我可以让CPU处理它,或者我可以自己处理它,如果我使用__try / __除外。
我知道当CPU尝试执行无效的操作码时会发生此中断。当发生这样的事件时,当前指令的地址(所以当前的eip / rip)被推入堆栈。调用ISR,执行某些操作然后重新执行相同的指令。 这让我觉得它试图跳过无效的操作码或修复它 - 否则为什么返回地址是无效指令的地址?
如果我编译以下用户模式代码:
int main()
{
printf("before\n");
__asm
{
UD2
};
printf("after\n");
return 0;
}
应用程序崩溃而不打印第二条消息。 如果我将UD2放在__try / __除了块中,我可以处理它,应用程序将不再崩溃。
驱动程序中的UD2指令将蓝屏系统。
那么KiTrap06究竟在做什么?或者在这种情况下发生崩溃,因为UD2是出于测试目的而在实际情况下结果可能不同?