Chapter VIII
CSAPP NOTE CHAP VIII
Chap 8 异常和中断#
基本概念#
中断 (Interrupt)#
- 来自CPU外部的事件,由外部设备(如I/O控制器)产生。
- 也称为”异步中断”,因为它与CPU的指令执行无关。
异常 (Exception)#
- 来自CPU内部的事件,是执行指令时产生的”内部错误”或特殊请求。
- 也称为”同步中断”。
处理过程#
- 中断/异常请求
- CPU响应(中止当前程序)
- 转去执行处理程序
- 处理结束,返回断点继续执行

中断和异常的分类#
异常的分类#
故障 (Faults)#
- 可纠正的错误。
- 在指令执行期间检测到。
- 处理后,重新执行引起故障的指令。
- (例如:除法出错、缺页)
陷阱 (Traps)#
- 有意的异常。
- 在指令执行之后通知系统。
- 处理后,执行下一条指令。
- (例如:软中断 INT n、单步调试)
中止 (Aborts)#
- 严重的、不可恢复的错误。
- 程序无法继续执行。
- (例如:硬件故障、系统表非法值)
中断的分类#
可屏蔽中断 (INTR)#
- 主要来自I/O设备的请求(如键盘、磁盘)。
- CPU可以通过设置标志寄存器中的IF标志位来”屏蔽”(暂时忽略)这些中断。
- 中断类型号由中断控制器(如8259A)提供。

不可屏蔽中断 (NMI)#
- 由严重的硬件故障引起(如掉电、存储器奇偶校验错)。
- 这种中断无法被IF标志屏蔽,CPU必须立即响应。

中断向量表#
中断向量表 (IVT) (实模式)#
中断向量表是存放各种中断处理程序入口地址的表。
- 位置: 固定在主存的
00000H到003FFH。 - 大小: 1KB。
- 中断数: 共 256 种中断 (类型号 0 ~ FFH)。
- 表项: 每个中断占 4 字节,用于存放其处理程序的入口地址 (CS:IP)。
- 地址计算: 中断向量地址 = 中断类型号 * 4

中断描述符表(IDT)(保护模式)#
- 在保护方式下,中断向量表称为 中断描述符表 (IDT)。
- IDT 的起始物理地址由
IDTR寄存器决定。 - 每个表项称为 门描述符,占 8 个字节,存放处理程序的入口地址、类别、权限等。
- 共 256 个表项,占用 2KB 主存空间。


中断有关指令#
1. 软中断#
- 形式:
INT n(n 为 0-255) - 功能:
- 将标志寄存器
EFLAGS压栈。 - 清除
IF(中断允许) 和TF(陷阱) 标志位。 - 将当前代码段
CS压栈。 - 将下一条指令的地址
EIP(返回地址) 压栈。 - 从中断向量表
(4*n)处取出IP,(4*n+2)处取出CS,并加载到CS:EIP寄存器,跳转到中断服务程序。
- 将标志寄存器
2. 中断返回#
- 形式:
IRET - 功能:
- 从堆栈弹出
EIP。 - 从堆栈弹出
CS。 - 从堆栈弹出
EFLAGS(这会自动恢复之前的IF和TF标志位)。
- 从堆栈弹出
中断处理举例#
需求: 实模式下,用空闲的中断类型号 45H,实现将 AX 中的内容以十六进制形式在屏幕上输出。
实现步骤:
- 按指定功能编制中断处理子程序
INTR45。 - 在中断向量表中,找到中断号
45H的位置。 - 将
INTR45的入口地址 (CS:IP) 送入中断向量表4 * 45H处。 - 在主程序中通过
INT 45H调用新增的中断处理子程序。
示例代码 (MASM 风格,仅为示例):
; 设置中断向量
START: MOV AX, 0
MOV DS, AX ; DS = 0, 指向 IVT
CLI ; 关中断
MOV WORD PTR DS:[45H * 4], OFFSET INTR45 ; 设置 IP
MOV WORD PTR DS:[45H * 4 + 2], CS ; 设置 CS
STI ; 开中断
; ... 主程序 ...
; 调用中断
MOV AX, [SI]
INT 45H ; 调用软中断
ADD SI, 2
LOOP L1
; ... 退出 ...
; --- 中断服务程序 ---
INTR45 PROC FAR
PUSHA ; 1. 保护现场
; ...
; (此处省略将 AX 中内容转为十六进制并显示的具体代码)
; ...
POPA ; 5. 恢复现场
IRET ; 6. 中断返回
INTR45 ENDPasm注意:
- 在中断处理子程序中,必须使用
PUSHA/POPA保护和恢复现场。 - 设置中断向量时,应先
CLI关中断,设置完毕后再STI开中断,防止在修改过程中发生中断。 - 必须使用
IRET指令实现中断返回。