中断
标识号称为向量,从 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,当 CPL⇐IOPL 的时候,才会恢复 IF