异常和中断的区别 微程序控制器设计与异常处理

linux 注册异常处理程序 Windows异常处理机制

中断

标识号称为向量,从 0 到 255,前 32 处理器定义了,后面用户定义,通常用于 IO

INT 3 就从这里来的

外部中断通过 INTR 和 NMI 两个引脚接收,当引脚接收到外部信号,CPU 从系统总线上读取外部中断控制器(8259A)提供的中断向量号。当 NMI 收到信号的时候,就产生非屏蔽中断(向量号 2)。INTR 可屏蔽(通过 ELFLAG 中的 IF 标志)

通过指令操作数可以提供中断向量号(INT),不过这个时候就不能通过 IF 标志屏蔽了

异常源

两个来源:处理器检测到的程序错误异常和软件自己产生的异常

指令 INTO,INT 3 和 BOUND 指令可以用来从软件中产生异常

开关中断

IF 标志可以用 STI 和 CLI 指令设置和清除,POPF 指令可以用于把已经修改过的标志内容放入 EFLAGS

任务切换和 IRET 也可以修改 IF

当通过中断门处理中断的时候,IF 会自动打开(陷阱门不会)

优先级

IDT 中断描述符表

Interrupt Descriptor Table 使用 IDTR 定位

有三种类型的门描述符:中断 Interrupt 陷阱 Trap 任务 Task

异常与中断处理

和 CALL 差不多,不同点在于:

  • 为了从中断返回,处理过程必须使用 IRET 指令,会把保存的寄存器内容回复到 EFLAGS 里,当 CPL 为 0 的时候(特权)才会恢复 IOPL,当 CPLIOPL 的时候,才会恢复 IF