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,支持虚拟化直通。
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 来接管安全中断处理。
4.3 安全中断路由机制
GICv3/v4 的路由决策基于中断的 分组 和 当前 PE 的安全状态。路由过程遵循以下规则:
- Group0 中断: 始终路由到 EL3(安全监控器),无论当前 PE 处于安全还是非安全状态。PE 以 FIQ 异常捕获。
- 安全 Group1 中断: 仅当 PE 处于安全状态时路由到 S-EL1/S-EL2;若 PE 处于非安全状态,则保持挂起或通过安全监控器转发。
- 非安全 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 中断抢占。
4.5 中断处理流程示例
以下是一个典型的安全中断处理流程,展示 Group0 中断如何从触发到完成:
- 中断触发: 安全外设(如安全定时器)产生中断信号。
- GIC 分发: 分发器识别中断为 Group0,检查优先级,路由到目标 PE。
- FIQ 异常: PE 捕获 FIQ 异常,切换到 EL3(安全监控器)。
- 上下文保存: 安全监控器保存非安全上下文,切换到安全世界。
- 中断处理: TEE OS 在 S-EL1 处理中断,执行安全服务。
- EOI 操作: TEE OS 写 ICC_EOIR0_EL1 寄存器,通知 GIC 中断处理完成。
- 上下文恢复: 安全监控器恢复非安全上下文,执行 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 中断。