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核心直接交互。

GICv3 三层架构:Distributor + Redistributor + CPU Interface Distributor(全局分发器) 中断优先级、路由表、全局使能、SPI管理、LPI配置表基址 Redistributor 0 PPI/SGI管理 LPI待决表 CPU Interface Redistributor 1 PPI/SGI管理 LPI待决表 CPU Interface ... Redistributor N CPU Core 0 CPU Core 1 CPU Core N 说明:每个CPU核心拥有独立的Redistributor;Distributor负责全局SPI/LPI路由,Redistributor负责本地PPI/SGI及LPI待决状态。

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(软件生成中断)。
性能要点:Distributor的寄存器访问通常通过MMIO(内存映射I/O)进行。在NUMA系统中,Distributor的物理位置可能远离某些CPU核心,导致访问延迟不对称。优化时需考虑将中断路由到离Distributor较近的核心。

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),决定是否允许中断嵌套。
Redistributor 内部结构:PPI/SGI管理 + LPI待决 + CPU Interface Redistributor(重分发器) PPI/SGI 管理 私有中断配置 软件触发中断 LPI 待决表 内存位图管理 待决状态跟踪 CPU Interface(CPU接口) 优先级屏蔽 (PMR) | 中断确认 (IAR) | 中断结束 (EOIR) | 运行优先级 抢占控制 | 中断分组 (Group 0/1) CPU Core IRQ/FIQ 信号 系统寄存器访问 来自Distributor 说明:CPU Interface 内嵌于 Redistributor 中,通过系统寄存器(ICC_*_EL1)与CPU核心交互,而非MMIO。

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 关键设计要点与性能考量

设计要点:在GICv3中,Distributor和Redistributor的寄存器映射在非安全物理地址空间中,而CPU Interface的寄存器通过系统寄存器(如ICC_IAR_EL1)访问。系统寄存器访问延迟通常低于MMIO,因此中断确认(IAR)和结束(EOIR)操作非常快。

3.6.1 中断路径延迟分析

  1. 外设触发中断:信号到达Distributor(SPI/LPI)或直接到达Redistributor(PPI)。
  2. Distributor处理:查找路由表,将中断转发给目标Redistributor(约几十ns)。
  3. Redistributor处理:更新LPI待决表或PPI/SGI状态,进行优先级比较(约几十ns)。
  4. CPU Interface处理:检查PMR屏蔽,向CPU核心发送IRQ/FIQ信号(约几个CPU周期)。
  5. CPU核心响应:保存上下文,读取ICC_IAR_EL1确认中断。
性能陷阱:LPI中断的待决表存储在内存中,Redistributor通过内存访问来更新待决状态。如果LPI中断频率极高(如高速网络设备),内存带宽和缓存一致性协议(如MESI)可能成为瓶颈。建议将LPI待决表放在与目标CPU核心同一NUMA节点的内存中。

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)。