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 用于收集外设中断。

8259A 集中式 vs APIC 分布式架构对比 传统 8259A 集中式 外设 IRQ0-7 外设 IRQ8-15 8259A 主片/从片 CPU (单核) APIC 分布式 I/O APIC I/O APIC Local APIC 0 Local APIC 1 CPU 0 CPU 1

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)的中断才会被递送。

APIC 中断优先级判定流程 I/O APIC 收到中断 查询 REDIR_TBL 比较优先级 > TPR 递送至目标 CPU TPR(Task Priority Register)由操作系统设置,用于屏蔽低优先级中断 只有中断优先级 > TPR 时,Local APIC 才会向 CPU 发送 INTR 信号

2.4 初始化流程差异

8259A 的初始化通过 ICW(初始化命令字)序列完成,需要按顺序写入 ICW1-ICW4。APIC 初始化则分为 Local APIC 和 I/O APIC 两部分:

  1. Local APIC 初始化:设置 SVR(Spurious Vector Register)使能 APIC,配置 LVT(Local Vector Table)条目,设置 TPR 为 0。
  2. I/O APIC 初始化:通过 APIC 基地址寄存器(APIC_BASE)定位 I/O APIC 寄存器,设置重定向表(REDIR_TBL)条目,指定中断向量、目标 CPU 和触发模式。
  3. 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(全范围)