中断(Interrupt)和异常(Exception)是指明系统、处理器或当前执行程序(或任务)的某处出现一个事件,该事件需要处理器进行处理。通常,这种事件会导致执行控制被强迫从当前运行转移到被称为中断处理程序(interrupt handler)或异常处理程序(exception handler)的特殊软件函数或任务中。处理器响应中断或异常所采取的行动被称为中断/异常服务(处理)。
4.6.1 异常和中断向量
为了有助于处理异常和中断,每个需要被处理器进行特殊处理的处理器定义的异常和中断条件都被赋予了一个标识号,称为向量(vector)。处理器把赋予异常或中断的向量作中断描述符表IDT(Interrupt Descriptor Table)中的一个索引号,来定位一个异常或中断的处理程序入口点位置。
4.6.2 中断源和异常源
1. 中断源
处理器从两种地方接收中断:外部(硬件产生)的中断;软件产生的中断。
2. 异常源
处理器接收的异常也有两个来源:处理器检测到的程序错误异常;软件产生的异常。
4.6.3 异常分类
根据异常被报告的方式以及导致异常的指令是否能够被重新执行,异常可被细分成故障(Fault)、陷阱(Trap)和中止(Abort)。
4.6.4 程序或任务的重新执行
4.6.5 开启和禁止中断
标志寄存器EFLAGS的中断允许标志IF(Interrupt enable Flag)能够禁止为处理器INTR引脚上收到的可屏蔽硬件中断提供服务。当IF=0时,处理器禁止发送到INTR引脚的中断;当IF=1时,则发送到INTR引脚的中断信息会被处理器处理。IF标志可以使用指令STI和CTI来设置或清除。
4.6.6 异常和中断的优先级
如果在一条指令边界有多个异常或中断等待处理时,处理器会按规定的次序对它们进行处理。处理器会首先处理最高优先级类中的异常或中断。低优先级的异常会被丢弃,而低优先级的中断则会被保持等待。当中断处理程序返回到产生异常和/或中断的程序或任务时,被丢弃的异常会重新发生。
4.6.7 中断描述符表
中断描述符表(Interrupt Descriptor Table,IDT)将每个异常或中断向量分别与它们的处理过程联系起来。与GDT和LDT表类似,IDT也是由8字节长描述符组成的一个数组。
IDT表可以驻留在线性地址空间的任何地方,处理器使用IDTR寄存器来定位IDT表的位置。LIDT和SIDT指令分别用于加载和保存IDTR寄存器的内容。
4.6.8 IDT描述符
IDT表中可以存放3种类型的门描述符:中断门(Interrupt gate)描述符、陷阱门(Trap gate)描述符、任务门(Task gate)描述符。
4.6.9 异常与中断处理
4.6.10 中断处理任务
4.6.11 错误码