2. PIC 与 APIC 对比:传统 8259A 与高级可编程中断控制器
在 x86 启动早期,系统使用 Intel 8259A 可编程中断控制器(PIC)管理硬件中断。随着多核处理器和复杂外设的出现,PIC 的局限性日益凸显,从而催生了高级可编程中断控制器(APIC)架构。本章从架构、路由能力、中断优先级和初始化流程四个维度进行对比。
核心结论:8259A 是单处理器时代的单通道中断控制器,最多支持 8 个中断源(级联后 15 个);APIC 是面向多核系统的分布式中断架构,支持 24 个以上中断源、处理器间中断(IPI)和灵活的路由策略。
2.1 架构对比:集中式 vs 分布式
8259A 采用集中式架构,所有中断请求先汇集到单一控制器,再由控制器向 CPU 的 INTR 引脚发送中断信号。APIC 则采用分布式架构,每个 CPU 核心包含一个本地 APIC(Local APIC),系统总线上挂载一个或多个 I/O APIC 用于收集外设中断。
2.2 中断路由能力对比
8259A 的中断路由是静态的:每个 IRQ 引脚固定对应一个中断向量号,且只能路由到唯一的 BSP(引导处理器)。APIC 支持灵活的中断路由,包括:
- 固定路由:中断发送到指定 CPU 或 CPU 组。
- 最低优先级路由:中断自动路由到当前负载最低的 CPU。
- 定向广播:中断发送到所有 CPU(除自身)。
- 处理器间中断(IPI):一个 CPU 向其他 CPU 发送中断,用于 TLB 刷新、任务调度等。
| 特性 | 8259A PIC | APIC(Local + I/O) |
|---|---|---|
| 中断源数量 | 8(级联后 15) | 24+(每个 I/O APIC) |
| 目标 CPU | 唯一 BSP | 任意 CPU / CPU 组 / 所有 CPU |
| 路由策略 | 固定引脚-向量映射 | 可编程重定向表(REDIR_TBL) |
| IPI 支持 | 不支持 | 支持(ICR 寄存器) |
| 中断优先级 | 4 位优先级(IRQ0 最高) | 8 位优先级(可编程) |
| 中断屏蔽粒度 | 按 IRQ 引脚屏蔽 | 按 IRQ 引脚 + 按向量屏蔽 |
启动阶段注意:UEFI 固件在启动早期(PEI 阶段)通常使用 8259A 兼容模式,直到 DXE 阶段才切换至 APIC 模式。切换时需正确屏蔽 8259A 并初始化 Local APIC 和 I/O APIC 的重定向表。
2.3 中断优先级与向量管理
8259A 使用隐式优先级:IRQ0(定时器)最高,IRQ7 最低。APIC 允许软件为每个中断源指定独立的优先级(0-255),并在 I/O APIC 的重定向表条目(REDIR_TBL)中设置。Local APIC 内部维护一个优先级队列,只有优先级高于当前 CPU 任务优先级(TPR)的中断才会被递送。
2.4 初始化流程差异
8259A 的初始化通过 ICW(初始化命令字)序列完成,需要按顺序写入 ICW1-ICW4。APIC 初始化则分为 Local APIC 和 I/O APIC 两部分:
- Local APIC 初始化:设置 SVR(Spurious Vector Register)使能 APIC,配置 LVT(Local Vector Table)条目,设置 TPR 为 0。
- I/O APIC 初始化:通过 APIC 基地址寄存器(APIC_BASE)定位 I/O APIC 寄存器,设置重定向表(REDIR_TBL)条目,指定中断向量、目标 CPU 和触发模式。
- 8259A 屏蔽:在 APIC 模式下,必须屏蔽 8259A 的所有中断(写入 OCW1 为 0xFF),防止两者冲突。
常见陷阱:在切换至 APIC 模式时,如果未正确屏蔽 8259A,会导致中断被 8259A 和 I/O APIC 同时处理,造成中断风暴或系统挂起。固件应在初始化 I/O APIC 之前,先将 8259A 的主片和从片全部屏蔽。
2.5 总结对比表
| 维度 | 8259A PIC | APIC |
|---|---|---|
| 适用平台 | 单处理器 | 多处理器(SMP) |
| 中断源扩展性 | 差(最多 15 个) | 好(每个 I/O APIC 24+) |
| 路由灵活性 | 无 | 固定/最低优先级/定向 |
| IPI 支持 | 无 | 有(TLB 刷新、自陷等) |
| 初始化复杂度 | 低(ICW 序列) | 中(Local + I/O APIC) |
| 中断向量范围 | 0x08-0x0F(可重映射) | 0x10-0xFE(全范围) |