3. GIC硬件架构:Distributor与Redistributor/CPU Interface的组成与功能划分
GIC(Generic Interrupt Controller)是ARM架构中管理中断的核心硬件单元。在GICv3/v4中,架构从传统的单一Distributor+CPU Interface模型演进为Distributor + Redistributor + CPU Interface的三层结构。理解这三者的职责划分,是进行中断配置、路由和性能调优的基础。
3.1 整体架构概览
GICv3/v4将中断控制逻辑分散到两个主要组件中:Distributor(全局分发器)和Redistributor(重分发器)。每个CPU核心(PE,Processing Element)都拥有一个专用的Redistributor,而整个系统中只有一个Distributor。CPU Interface则内嵌在Redistributor内部,负责与CPU核心直接交互。
3.2 Distributor(全局分发器)
Distributor是GIC的中枢控制单元,负责系统中所有共享外设中断(SPI)和LPI(Locality-specific Peripheral Interrupt)的全局管理。它不直接与CPU核心通信,而是通过配置Redistributor来间接控制中断的送达。
3.2.1 Distributor的核心功能
- 全局中断使能控制:通过GICD_CTLR寄存器控制Distributor的全局使能/禁用。
- SPI中断管理:配置SPI的优先级、触发方式(边沿/电平)、目标CPU(通过GICD_IROUTER寄存器组)。
- LPI配置表基址:提供LPI属性表(包括优先级和使能状态)和待决表在内存中的基地址。
- 中断分组:将中断分为Group 0(安全中断,FIQ)和Group 1(非安全中断,IRQ)。
- 软件触发中断:支持通过GICD_SGIR寄存器生成SGI(软件生成中断)。
3.3 Redistributor(重分发器)
每个CPU核心拥有一个专用的Redistributor。它负责管理私有外设中断(PPI)、软件生成中断(SGI)以及LPI的待决状态。Redistributor是连接Distributor与CPU Interface的桥梁。
3.3.1 Redistributor的核心功能
- PPI/SGI管理:每个Redistributor独立管理其关联CPU的PPI(如Timer、PMU中断)和SGI(核间通信中断)。
- LPI待决状态跟踪:维护LPI的待决位图(Pending Table),当LPI被触发时,Redistributor在内存中标记待决状态。
- 中断优先级过滤:在将中断转发给CPU Interface之前,进行优先级比较和屏蔽。
- 电源管理支持:当CPU进入低功耗状态时,Redistributor可以缓存中断,并在CPU唤醒后递送。
3.4 CPU Interface(CPU接口)
在GICv3/v4中,CPU Interface不再是独立的硬件模块,而是集成在Redistributor内部的逻辑单元。它负责与CPU核心的执行上下文直接交互,是中断信号进入CPU的最后一道关卡。
3.4.1 CPU Interface的核心功能
- 中断优先级屏蔽:通过ICC_PMR_EL1寄存器设置当前CPU的优先级阈值,低于该阈值的中断被屏蔽。
- 中断确认与结束:CPU通过读取ICC_IAR_EL1寄存器确认中断,通过写入ICC_EOIR_EL1寄存器表示中断处理结束。
- 运行优先级管理:维护当前CPU的运行优先级(Running Priority),防止低优先级中断抢占高优先级处理流程。
- 中断抢占控制:根据优先级分组和抢占模型(1-N/N-N),决定是否允许中断嵌套。
3.5 功能划分对比表
| 功能维度 | Distributor | Redistributor | CPU Interface |
|---|---|---|---|
| 中断类型 | SPI, LPI(全局配置) | PPI, SGI, LPI(本地待决) | 所有已送达的中断 |
| 寄存器访问方式 | MMIO (GICD_*) | MMIO (GICR_*) | 系统寄存器 (ICC_*_EL1) |
| 中断路由 | 配置SPI目标Redistributor | 将中断转发给关联的CPU Interface | 直接向CPU核心发送IRQ/FIQ信号 |
| 优先级管理 | 设置SPI/LPI优先级 | 本地优先级过滤 | 运行优先级屏蔽与抢占 |
| 电源管理 | 全局电源状态 | 每CPU中断缓存与唤醒 | CPU休眠时的中断屏蔽 |
| 中断结束 | 不参与 | 不参与 | 通过ICC_EOIR_EL1完成 |
3.6 关键设计要点与性能考量
3.6.1 中断路径延迟分析
- 外设触发中断:信号到达Distributor(SPI/LPI)或直接到达Redistributor(PPI)。
- Distributor处理:查找路由表,将中断转发给目标Redistributor(约几十ns)。
- Redistributor处理:更新LPI待决表或PPI/SGI状态,进行优先级比较(约几十ns)。
- CPU Interface处理:检查PMR屏蔽,向CPU核心发送IRQ/FIQ信号(约几个CPU周期)。
- CPU核心响应:保存上下文,读取ICC_IAR_EL1确认中断。
3.6.2 多核系统中的中断亲和性
Distributor通过GICD_IROUTER寄存器为每个SPI指定目标Redistributor(即目标CPU)。在Linux内核中,可以通过/proc/irq/<irq_num>/smp_affinity动态调整中断亲和性。合理的亲和性设置可以避免中断在多个核心间迁移,减少缓存抖动。
# 将中断号128绑定到CPU核心0和1
echo 3 > /proc/irq/128/smp_affinity
# 查看当前绑定
cat /proc/irq/128/smp_affinity
# 输出: 03
3.7 本章小结
- Distributor:全局中断路由与配置中心,管理SPI/LPI的优先级、分组和目标。
- Redistributor:每CPU中断代理,管理PPI/SGI和LPI待决状态,是中断本地化的关键。
- CPU Interface:中断递送的最后一环,通过系统寄存器实现快速确认与结束。
- 三层架构的设计使得中断处理具有可扩展性(每个CPU独立管理本地中断)和低延迟(系统寄存器访问优于MMIO)。