4. 可编程中断控制器 8259A:架构、级联、初始化与中断优先级管理
8259A 是 Intel 为 8086/8088 系统设计的可编程中断控制器(PIC),在 x86 架构的早期版本(如 PC/AT)中承担中断路由与优先级裁决的核心职责。虽然现代系统已转向 APIC 或 GIC,但 8259A 的级联模型、ICW/OCW 编程接口和优先级管理逻辑仍是理解中断控制器设计原理的最佳入门范例。
4.1 8259A 内部架构
单个 8259A 芯片可管理 8 个中断请求输入(IR0–IR7),内部由以下关键模块构成:
- 中断请求寄存器(IRR):记录当前已触发但尚未响应的中断请求。
- 中断服务寄存器(ISR):记录当前正在服务的中断,用于嵌套控制。
- 中断屏蔽寄存器(IMR):按位屏蔽对应的 IR 输入,屏蔽位为 1 时禁止该中断。
- 优先级裁决器(Priority Resolver):比较 IRR 中未屏蔽的请求与 ISR 中正在服务的优先级,决定是否向 CPU 发出 INT 信号。
- 控制逻辑与数据总线缓冲器:负责与 CPU 的 INTA 应答握手、ICW/OCW 写入以及中断向量号输出。
关键指标: 8259A 的中断响应延迟约为 2–3 个 CPU 时钟周期(在 5–10 MHz 下),级联后最多支持 64 个中断源。
4.2 级联方式
单个 8259A 只能管理 8 个中断源,通过级联可扩展至最多 64 个。级联结构采用主—从模式:
- 主片(Master):直接与 CPU 连接,其 IR 引脚可接从片的 INT 输出。
- 从片(Slave):INT 输出接主片的一个 IR 输入,通过 CAS0–CAS2 三线级联总线与主片通信。
- 每个从片占用主片的一个 IR 槽位,从片自身再管理 8 个中断源。
| 参数 | 说明 |
|---|---|
| 最大级联数 | 1 主片 + 8 从片 = 9 片 |
| 最大中断源 | 8 × 8 = 64 个 |
| 级联标识 | ICW3 中主片设置从片连接的 IR 位,从片设置自身级联 ID |
| CAS 总线 | 3 位级联地址线,主片在 INTA 周期输出从片 ID |
设计要点: 级联时从片的中断响应延迟会增加约 2–3 个 INTA 周期,因为主片需要额外一个 INTA 脉冲来获取从片的向量号。
4.3 初始化命令字(ICW)
8259A 在上电后必须通过 ICW 序列完成初始化,ICW 共 4 个(ICW1–ICW4),写入顺序固定:
| 命令字 | 端口 | 功能 | 关键位 |
|---|---|---|---|
| ICW1 | 0x20(主片)/ 0xA0(从片) | 触发初始化、设置触发方式(边沿/电平)、是否级联 | D4=1 标识 ICW1;D3=LTIM 触发方式;D1=SNGL 单/级联 |
| ICW2 | 0x21(主片)/ 0xA1(从片) | 设置中断向量基址(高 5 位) | 高 5 位为基址,低 3 位由 IR 编号自动填充 |
| ICW3 | 0x21 / 0xA1 | 级联标识:主片设置从片连接的 IR 位;从片设置级联 ID | 主片:8 位位图;从片:低 3 位 ID |
| ICW4 | 0x21 / 0xA1 | 设置模式:全嵌套、缓冲、特殊全嵌套、自动 EOI 等 | D4=SFNM 特殊全嵌套;D3=BUF 缓冲模式;D1=AEOI 自动 EOI |
初始化流程: 写入 ICW1(端口 0x20/0xA0)→ 写入 ICW2(端口 0x21/0xA1)→ 若级联则写入 ICW3 → 若 ICW4 需要则写入 ICW4。ICW1 的 D4 位必须为 1,否则 8259A 不会进入初始化序列。
4.4 操作命令字(OCW)
初始化完成后,通过 OCW 动态控制 8259A 的运行行为。OCW 共 3 个,写入端口与 ICW 相同,但通过特征位区分:
| 命令字 | 端口 | 功能 | 关键位 |
|---|---|---|---|
| OCW1 | 0x21 / 0xA1 | 设置/清除 IMR 屏蔽位 | 8 位屏蔽位,1=屏蔽 |
| OCW2 | 0x20 / 0xA0 | 发送 EOI(中断结束)、设置优先级循环模式 | R、SL、EOI 三位组合控制 |
| OCW3 | 0x20 / 0xA0 | 读取 IRR/ISR 状态、设置特殊屏蔽模式、查询中断 | P=1 查询命令;RR/RIS 读取 IRR 或 ISR |
常用 OCW2 组合: 非特殊 EOI(0x20)用于全嵌套模式;特殊 EOI(0x60+IR 编号)用于非全嵌套;循环优先级 EOI(0xA0)用于任务公平调度。
4.5 中断优先级管理
8259A 支持多种优先级管理模式,通过 ICW4 和 OCW2 配置:
- 全嵌套模式(FNM):默认模式,IR0 优先级最高,IR7 最低。仅当更高优先级中断到达时才能嵌套。
- 特殊全嵌套模式(SFNM):用于级联主片,允许同一从片内的更高优先级中断在主片服务期间嵌套。
- 自动循环优先级:服务完成后,刚服务的中断降为最低优先级,其他中断轮转提升。适用于多个设备优先级均等的场景。
- 特殊循环优先级:通过 OCW2 手动指定最低优先级,其余按顺序轮转。
- 特殊屏蔽模式:通过 OCW3 设置,允许在 ISR 中临时允许低优先级中断,用于死锁避免。
| 模式 | 配置方式 | 适用场景 |
|---|---|---|
| 全嵌套(FNM) | ICW4 D4=0 | 单 8259A 系统,固定优先级 |
| 特殊全嵌套(SFNM) | ICW4 D4=1 | 级联主片,允许从片内嵌套 |
| 自动循环 | OCW2 R=1, SL=0, EOI=1 | 多设备公平共享 CPU |
| 特殊循环 | OCW2 R=1, SL=1, EOI=1 + 低 3 位 | 动态调整最低优先级 |
| 特殊屏蔽 | OCW3 SSMM=1, SMM=1 | ISR 中临时允许低优先级中断 |
避坑提示: 在级联系统中,主片必须配置为特殊全嵌套模式(SFNM),否则从片内的更高优先级中断无法在主片服务期间被响应,导致中断丢失。
4.6 编程示例:8259A 初始化代码
以下为 x86 实模式下 8259A 的典型初始化序列(主片向量基址 0x08,从片 0x70):
; 主片初始化
MOV AL, 0x11 ; ICW1: 边沿触发 + 级联 + 需要 ICW4
OUT 0x20, AL
MOV AL, 0x08 ; ICW2: 中断向量基址 0x08
OUT 0x21, AL
MOV AL, 0x04 ; ICW3: 主片 IR2 连接从片
OUT 0x21, AL
MOV AL, 0x01 ; ICW4: 全嵌套 + 非缓冲 + 正常 EOI
OUT 0x21, AL
; 从片初始化
MOV AL, 0x11 ; ICW1
OUT 0xA0, AL
MOV AL, 0x70 ; ICW2: 中断向量基址 0x70
OUT 0xA1, AL
MOV AL, 0x02 ; ICW3: 从片级联 ID = 2
OUT 0xA1, AL
MOV AL, 0x01 ; ICW4
OUT 0xA1, AL
; 清除屏蔽(允许所有中断)
MOV AL, 0x00
OUT 0x21, AL
OUT 0xA1, AL
关键点: 主片 ICW3 的 0x04 表示 IR2 连接从片;从片 ICW3 的 0x02 表示其级联 ID 为 2,与主片 IR2 对应。向量基址必须与 IDT 表项对齐。