关于中断和异常向量:
IA-32架构为每一个异常和需要处理器特殊处理的中断分配了一个识别码,
称为:向量;处理器用这个向量作为访问中断描述表IDT的索引,以确定异常
或中断处理程序入口点;
向量号范围是0-255。0-31被IA-23架构保留给架构定义的异常和中断。
用户不应该使用保留的向量,32-255的向量指派给用户定义的中断,这些中断
一般都分配给外部I/0设备;
中断源分为外部中断和软件中断
外部中断
外部中断是通过处理器的引脚或者本地APIC接收的。中断引脚为LINT[1:0]
当APIC打开时,可通过APIC的局部向量表LVT对LINT[1:0]引脚编程;
当APIC关闭时,这两个引脚分别配置为INTR(可屏蔽)和NMI(不可屏蔽)引脚。
当激活INTR引脚传递一个信号给处理器时,则表明一个外部中断发生了,处
理器从系统总线读取诸如8259A外部中断控件器发来的中断向量号。
当激活NMI引脚则发送一个不可屏蔽中断的信号,其向量号为2;
注:早期的处理器没有APIC,因而也没有LINT[1:0]引脚,对于这些处理器,外部中
断由系统板上的中断控件器(8259A)产生。
可屏蔽硬件中断
凡是通过INTR引脚或APIC传递到处理器的外部中断都是可屏蔽中断。通过INTR引
脚传递的可屏蔽硬件中断可使用IA-32架构定义的所有中断向量0-255;而通过APIC传递
的只能是16-255号向量;
使用IF标志可以一下子屏蔽全部可屏蔽硬件中断;
软件中断
int 中断向量号即可产生软件中断。int 指令或使用0-255中断向量号;
异常源分为程序错误异常,软件产生的异常,机器检测异常
程序错误异常
在应用程序、操作系统和管理程序的执行过程中,当探测到程序错误时,
处理器产生异常。IA-32为每个异常定义了一个向量号,这些异常双分为故障、
陷阱和终止;
软件产生的异常
INTO、INT 3和BOUND指令允许在软件中产生异常。这些指令允许在指令流中
定点检测指定的异常条件,如int 3产生一个硬件异常;
机器检测异常
用来检测内部芯片和总线事件的操作,当探测到一个机器错误时,处理器发出18号
中断;
异常分类
故障
是一种能够被修正的异常,而且一旦修正,程序能够在不失连续的情况下重新
启动。当有故障时,处理器将机器状态恢复到发生故障之前的状态;
陷阱
陷阱是一种引起陷阱的指令执行之后马上报告的一种异常。陷阱允许程序
或者任务的执行不失连续性的情况下继续执行。
终止
引起后程序退出,不可恢复;处理器会收集有关诊断信息。
不可屏蔽中断
当外部硬件激活NMI引脚和处理器从系统总线收到消息或者从APIC串行
总线收到NMI消息
不中断是通过中断门处理的时候,IF标志会自动清除,并关闭可屏蔽硬件中断。
中断描述符表IDT **************************
IDT把每一个异常或中断向量和对应的中断或异常服务的例程或任务的门描述符
之间建立了联系;
IDT 的基址是8字节对齐的,界限总是8的倍数
处理器通过IDTR寄存器寻址IDT。IDTR中包括了IDT表的基址和界限,这样基址+界限(偏移)
即为描述符的地址;
IDT描述符
任务门描述符
任务门中包含异常或中断处理任务的TSS的段选择子;
中断门描述符
同调用门相似,处理器用它来将流程转移到异常或中断处理代码段中处理。
陷阱门描述符
同调用门相似,处理器用它来将流程转移到异常或中断处理代码段中处理。
异常和中断处理
响应异常和中断时,处理器中断向量号作为IDT的描述符索引。若该索引指向
一个中断门或陷阱门,那么些处理器call例程;若该索引指向的是任务门,处理器
将执行任务切换,切换到异常或中断处理例程;
异常和中断处理例程
中断门或陷阱门运行在当前进程的场境中。
当处理器执行一个异常或中断处理例程调用时:
如将要执行处理例程特权级较小,就进行栈切换: