当抛出异常时,处理器如何知道该去哪里



我的处理器如何决定在遇到异常时执行什么代码?

异常处理程序的地址是存储在堆栈中的某个位置还是寄存器中?Windows是否以对"传统"开发人员不透明的方式进行异常处理,或者Windows是否支持第三方开发人员实现异常处理程序?

我想我们谈论的是CPU级别的异常——访问违规、无效指令、除以零等等。对于这些,CPU中有一个寄存器,用于存储包含异常处理程序地址的特定数据结构(中断描述符表,IDT(的地址。IDT由操作系统内核维护,用户代码不可见。异常的处理程序也由操作系统内核提供。

这就是英特尔x86/x86-64的故事;Windows也在ARM上运行。在ARM CPU上,控制权传递给内存低部分的处理程序(地址0x00000000及以上(。中断类型是处理程序表("矢量表"(的索引。每个处理程序有4个字节长,所以它通常是一个jmp命令。跳转的目标是操作系统提供的真正的处理程序。操作系统确保矢量表不受userland代码的限制。

C++/Java/C#/Python异常则完全不同。


受";我如何修改IDT;评论:我有99%的把握,无论你想完成什么,都不需要这个。Windows中有各种更高级别的中断驱动机制;无论你试图对异常做什么,都有可能通过扰乱IDT来完成sans。首先,阅读__try/__catch,它与C++try/catch不同。然后是向量异常处理。

最新更新