4. 中断控制器GICv3/v4:GIC架构概述、中断分组(Group0/Group1)、安全中断路由与优先级

4.1 GICv3/v4 架构概述

通用中断控制器(Generic Interrupt Controller, GIC)是ARM架构中管理中断的核心组件。GICv3/v4是当前主流版本,专为支持大型多核系统、虚拟化以及TrustZone安全扩展而设计。与GICv2相比,GICv3/v4引入了关键变化:CPU接口与分发器分离、中断分组(Group0/Group1)以及基于消息的中断(LPI)。

核心组件:
  • 分发器(Distributor): 全局中断控制逻辑,负责中断优先级、分组、路由和使能。
  • 重分发器(Redistributor): 每个PE(处理单元)一个,管理该PE的PPI、SGI和LPI配置。
  • CPU接口(CPU Interface): 每个PE一个,处理中断的应答(ACK)、结束(EOI)和优先级掩码。
  • ITS(Interrupt Translation Service): GICv3/v4新增,用于将设备ID映射为LPI中断ID,支持虚拟化直通。
GICv3 架构组件关系 分发器 全局中断控制 重分发器 0 PPI/SGI/LPI 重分发器 1 PPI/SGI/LPI CPU接口 0 CPU接口 1 PE 0 PE 1 ITS (中断翻译服务) 每个PE拥有独立的 重分发器 + CPU接口

4.2 中断分组:Group0 与 Group1

GICv3/v4 将中断分为两个安全组:Group0 和 Group1。这是实现 TrustZone 安全中断隔离的基础。Group1 进一步细分为 安全 Group1 和 非安全 Group1。

分组 目标安全状态 FIQ/IRQ 路由 典型用途
Group0 始终路由到安全世界(EL3) FIQ 安全监控器(Secure Monitor)中断、安全定时器
安全 Group1 路由到安全世界(S-EL1/S-EL2) IRQ TEE 操作系统(如 OP-TEE)的设备中断
非安全 Group1 路由到非安全世界(NS-EL1/NS-EL2) IRQ Rich OS(如 Linux)的设备中断
关键概念: 中断分组通过 GICD_IGROUP 和 GICD_IGRPMOD 寄存器配置。Group0 中断始终以 FIQ 信号发送给 PE,而 Group1 中断以 IRQ 信号发送。安全监控器(EL3)通过捕获 FIQ 来接管安全中断处理。
中断分组与安全路由 Group0 中断 安全 Group1 非安全 Group1 GIC 分发器 分组检查 优先级裁决 路由决策 安全状态过滤 EL3 安全监控器 FIQ 处理 S-EL1 TEE OS IRQ 处理 NS-EL1 Rich OS IRQ 处理 Group0 → FIQ Group1 → IRQ

4.3 安全中断路由机制

GICv3/v4 的路由决策基于中断的 分组 和 当前 PE 的安全状态。路由过程遵循以下规则:

  1. Group0 中断: 始终路由到 EL3(安全监控器),无论当前 PE 处于安全还是非安全状态。PE 以 FIQ 异常捕获。
  2. 安全 Group1 中断: 仅当 PE 处于安全状态时路由到 S-EL1/S-EL2;若 PE 处于非安全状态,则保持挂起或通过安全监控器转发。
  3. 非安全 Group1 中断: 仅当 PE 处于非安全状态时路由到 NS-EL1/NS-EL2;若 PE 处于安全状态,则保持挂起。
重要: 中断路由受 GICD_IROUTER 寄存器控制,该寄存器指定中断目标 PE。对于 SPI(共享外设中断),可以配置为路由到特定 PE 或任意 PE。安全中断必须路由到支持安全状态的 PE。

4.4 中断优先级与安全隔离

GICv3/v4 支持 256 级优先级(0-255,0 为最高)。优先级寄存器(GICD_IPRIORITYR)为每个中断分配优先级值。安全世界和非安全世界拥有独立的优先级掩码寄存器:

寄存器 所属世界 功能
ICC_PMR_EL1 当前安全状态 设置中断优先级掩码,只有优先级高于此值的中断才能被 PE 处理
ICC_AP0R_EL1 安全世界 Group0 中断的优先级组寄存器
ICC_AP1R_EL1 安全/非安全 Group1 中断的优先级组寄存器

优先级安全隔离规则:

  • 安全世界可以设置 任何优先级值,包括最高优先级(0)。
  • 非安全世界 不能设置 高于安全世界配置的 安全优先级阈值(由 SCR_EL3.IRQ/FIQ 和 GIC 安全配置决定)。
  • 安全中断的优先级始终高于非安全中断,确保 TEE 关键操作不会被 Rich OS 中断抢占。
中断优先级与安全隔离 优先级 (0=最高) 安全中断区域 优先级 0-127 仅安全世界可配置 非安全中断区域 优先级 128-255 安全阈值 安全隔离规则 1. 安全中断优先级始终高于非安全 2. 非安全世界无法设置安全优先级 3. 安全监控器可抢占任何非安全中断 4. TEE OS 中断不受 Rich OS 干扰 5. 优先级掩码寄存器独立保存

4.5 中断处理流程示例

以下是一个典型的安全中断处理流程,展示 Group0 中断如何从触发到完成:

  1. 中断触发: 安全外设(如安全定时器)产生中断信号。
  2. GIC 分发: 分发器识别中断为 Group0,检查优先级,路由到目标 PE。
  3. FIQ 异常: PE 捕获 FIQ 异常,切换到 EL3(安全监控器)。
  4. 上下文保存: 安全监控器保存非安全上下文,切换到安全世界。
  5. 中断处理: TEE OS 在 S-EL1 处理中断,执行安全服务。
  6. EOI 操作: TEE OS 写 ICC_EOIR0_EL1 寄存器,通知 GIC 中断处理完成。
  7. 上下文恢复: 安全监控器恢复非安全上下文,执行 ERET 返回非安全世界。
实践要点:
  • 配置中断分组时,确保 Group0 中断的 GICD_IGROUP 位为 0,GICD_IGRPMOD 位为 0。
  • 安全 Group1 中断的 GICD_IGROUP 位为 1,GICD_IGRPMOD 位为 1。
  • 非安全 Group1 中断的 GICD_IGROUP 位为 1,GICD_IGRPMOD 位为 0。
  • 使用 GICD_IROUTER 将安全中断路由到支持安全状态的 PE(通常为 PE0)。

4.6 GICv4 虚拟化扩展

GICv4 在 v3 基础上增加了对 虚拟中断 的直接支持,允许虚拟机直接管理中断而无需 VMM 介入。关键特性包括:

  • VLPI(Virtual LPI): 直接路由到虚拟机的 LPI 中断。
  • vSGI(Virtual SGI): 虚拟机间软件触发中断。
  • Doorbell 机制: 当物理中断需要注入虚拟机时,通过 doorbell 通知 VMM。
特性 GICv3 GICv4
LPI 支持 是 是
虚拟 LPI (VLPI) 否 是
虚拟 SGI (vSGI) 否 是
Doorbell 中断 否 是
ITS 虚拟化 有限 完整
安全提示: 在虚拟化环境中,安全中断(Group0/安全 Group1)必须绕过虚拟化层,直接由物理 GIC 路由到安全 EL3 或 S-EL2。GICv4 的虚拟化特性仅适用于非安全 Group1 中断。
GICv4 虚拟中断流 物理设备 ITS 重分发器 VMM 虚拟机 Doorbell 中断 VLPI 注入 GICv4 优势 • 减少 VMM 干预 • 降低中断延迟 • 支持直通设备 • 安全中断不受影响