NknSのSitE

Back

Chapter VIII

CSAPP NOTE CHAP VIII

Chap 8 异常和中断#

基本概念#

中断 (Interrupt)#

  • 来自CPU外部的事件,由外部设备(如I/O控制器)产生。
  • 也称为”异步中断”,因为它与CPU的指令执行无关。

异常 (Exception)#

  • 来自CPU内部的事件,是执行指令时产生的”内部错误”或特殊请求。
  • 也称为”同步中断”。

处理过程#

  1. 中断/异常请求
  2. CPU响应(中止当前程序)
  3. 转去执行处理程序
  4. 处理结束,返回断点继续执行

image-20251116043916264

中断和异常的分类#

异常的分类#

故障 (Faults)#

  • 可纠正的错误。
  • 在指令执行期间检测到。
  • 处理后,重新执行引起故障的指令。
  • (例如:除法出错、缺页)

陷阱 (Traps)#

  • 有意的异常。
  • 在指令执行之后通知系统。
  • 处理后,执行下一条指令。
  • (例如:软中断 INT n、单步调试)

中止 (Aborts)#

  • 严重的、不可恢复的错误。
  • 程序无法继续执行
  • (例如:硬件故障、系统表非法值)

中断的分类#

可屏蔽中断 (INTR)#

  • 主要来自I/O设备的请求(如键盘、磁盘)。
  • CPU可以通过设置标志寄存器中的IF标志位来”屏蔽”(暂时忽略)这些中断。
  • 中断类型号由中断控制器(如8259A)提供。

image-20251116044023149

不可屏蔽中断 (NMI)#

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

image-20251116044047949

中断向量表#

中断向量表 (IVT) (实模式)#

中断向量表是存放各种中断处理程序入口地址的表。

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

image-20251116044137316

中断描述符表(IDT)(保护模式)#

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

image-20251116044429898

image-20251116044434865

中断有关指令#

1. 软中断#

  • 形式: INT n (n 为 0-255)
  • 功能:
    1. 将标志寄存器 EFLAGS 压栈。
    2. 清除 IF (中断允许) 和 TF (陷阱) 标志位。
    3. 将当前代码段 CS 压栈。
    4. 将下一条指令的地址 EIP (返回地址) 压栈。
    5. 从中断向量表 (4*n) 处取出 IP(4*n+2) 处取出 CS,并加载到 CS:EIP 寄存器,跳转到中断服务程序。

2. 中断返回#

  • 形式: IRET
  • 功能:
    1. 从堆栈弹出 EIP
    2. 从堆栈弹出 CS
    3. 从堆栈弹出 EFLAGS (这会自动恢复之前的 IFTF 标志位)。

中断处理举例#

需求: 实模式下,用空闲的中断类型号 45H,实现将 AX 中的内容以十六进制形式在屏幕上输出。

实现步骤:

  1. 按指定功能编制中断处理子程序 INTR45
  2. 在中断向量表中,找到中断号 45H 的位置。
  3. INTR45 的入口地址 (CS:IP) 送入中断向量表 4 * 45H 处。
  4. 在主程序中通过 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		ENDP
asm

注意:

  1. 在中断处理子程序中,必须使用 PUSHA / POPA 保护和恢复现场。
  2. 设置中断向量时,应先 CLI 关中断,设置完毕后再 STI 开中断,防止在修改过程中发生中断。
  3. 必须使用 IRET 指令实现中断返回。