X86平台的中断和异常

英特尔的官方文档如下定义x86平台下的中断和异常:

中断:

  • 可屏弊中断(Maskable Interrupts)

            所有由I/O设备发出的IRQ(Interupt Requests)都是可屏弊中断。可屏弊中断可以有两个状态:屏弊和未屏弊。屏弊状态的中断会被中断控制硬件忽略。

  • 不可屏弊中断(Nonmaskable Interrupts)

           只有一些关键的事件(如硬件失败)会发出不可屏弊中断。不可屏弊中断总是可以被CPU识别到。

 

异常:

  • 处理器可侦测异常(Processor-detected Exceptions)

           CPU执行指令时侦测到不正常的状态(anomalous condition)时产生这个异常。这种异常又根据存在内核栈上的EIP寄存器的值被划分为三组。

  • 错误(Faults)

           发生错误时,一般情况下可以被纠正。纠正以后,程序继续运行,不会损失连续性。保存下的EIP寄存器的值就是产生这个错误的指令,当异常处理句柄(exception handler)结束后,程序从这条指令继续运行。

  • 陷入(Traps)

          当被中止的指令无需重新执行时就产生陷入,这点与错误(Faults)不同。陷入主要被用来实现调试器。

  • 中止(Aborts)

           严重出错。控制硬件出现故障,此时不可能把造成异常的指令精确地址存入EIP寄存器。Aborts被用来报告严重的出错,比如硬件出错或者无效的,不一致的系统表结构。由控制硬件单元发出的中断信号被用来把控制权转交给中止异常句柄(Abort Exception Handler)。句柄通常只有强制结束造成Abort的程序。

  • 可编程异常(Programmed Exceptions)

          这是由程序员发出的。程序员可以用int 或者int 3指令发出可编程异常。Into(检查溢出)bound(检查数组越界)指令也可以用来发出可编程异常。可编程异常常常被称之为软中断(software interrupts)。这种异常通常用来实现系统调用,还被用来在调试器中报告事件。(into和bound指令在IA64体系中已经被废弃了,见另一篇博文:C语言和它的安全性)

copyright ykyi.net