3. 中断基础
在 TrustZone 安全工程中,中断是安全世界与非安全世界之间最频繁、最敏感的交互入口之一。理解中断的基本机制,是后续分析安全中断路由、异常级别切换以及内存隔离的前提。本节从硬件视角出发,梳理中断类型、中断控制器、中断向量表、优先级与处理流程五个核心概念,并说明它们在 TrustZone 场景下的特殊表现。
一、中断类型:从来源到行为的分类
中断本质上是处理器正常指令流被外部或内部事件打断,转去执行特定处理程序的机制。按来源可分为三类:
- 外部中断(IRQ/FIQ):由外设(如 UART、定时器、GPIO)通过中断控制器向 CPU 发出。IRQ 为普通中断,FIQ 为快速中断,后者拥有独立寄存器组,响应更快。
- 内部异常(Exception):由 CPU 内部事件触发,包括同步异常(如 SVC 系统调用、数据中止、指令预取中止)和异步异常(如 SError 系统错误)。
- 软件生成中断(SGI):由软件写中断控制器寄存器触发,常用于多核间通信(IPI),在 TrustZone 中也可用于安全世界向非安全世界发送通知。
在 ARMv8-A 架构下,异常级别 EL0~EL3 与中断类型紧密耦合:EL3 通常运行安全监控器(Secure Monitor),EL1 运行操作系统内核,EL0 运行用户态。中断可以配置为路由到特定 EL,这是 TrustZone 中断隔离的基础。
二、中断控制器:GIC 的结构与角色
通用中断控制器(GIC)是 ARM 平台的标准中断管理单元。以 GICv3 为例,其核心组件包括:
- Distributor(分发器):负责全局中断使能、优先级配置、目标 CPU 选择以及安全/非安全分组。
- Redistributor(再分发器):每个 CPU 核一个,负责将中断转发给对应的 CPU 接口,并管理 SGI 和 PPI。
- CPU Interface(CPU 接口):与处理器核心直接相连,执行中断确认(ACK)、优先级屏蔽和中断结束(EOI)。
在 TrustZone 环境中,GIC 支持将每个中断配置为 Group 0(安全)或 Group 1(非安全)。安全世界可以通过 GICD_IGROUPR 寄存器控制分组,从而决定哪些中断只能由安全世界处理,哪些可以路由到非安全世界。这种分组机制是安全中断隔离的关键。
关键点:GICv3 的 Group 0 中断通常用于安全世界,Group 1 用于非安全世界。但安全世界可以通过设置 SCR_EL3.IRQ 和 SCR_EL3.FIQ 位,决定是否将物理中断路由到 EL3 处理,从而实现安全监控器的中断拦截。
三、中断向量表:异常入口的跳转表
中断向量表(Vector Table)是处理器在发生异常时查找处理程序入口的固定内存区域。在 AArch64 中,向量表由 16 个条目组成,每个条目 128 字节,按异常类型和来源 EL 排列。其结构如下:
| 偏移 | 异常类型 | 说明 |
|---|---|---|
| 0x000 | Synchronous | 当前 EL 同步异常 |
| 0x080 | IRQ | 当前 EL 普通中断 |
| 0x100 | FIQ | 当前 EL 快速中断 |
| 0x180 | SError | 当前 EL 系统错误 |
| 0x200 | Synchronous | 低 EL 同步异常 |
| 0x280 | IRQ | 低 EL 普通中断 |
| 0x300 | FIQ | 低 EL 快速中断 |
| 0x380 | SError | 低 EL 系统错误 |
向量表的基地址由 VBAR_ELx 寄存器指定。在 TrustZone 中,EL3、EL1 安全、EL1 非安全各自拥有独立的 VBAR,这意味着安全世界和非安全世界的中断处理程序完全隔离,互不可见。
四、中断优先级与抢占
GIC 为每个中断分配 8 位优先级字段(实际实现可能只使用高 5 位),数值越小优先级越高。优先级机制支持中断嵌套:高优先级中断可以抢占正在执行的低优先级中断处理程序。
在 TrustZone 场景下,优先级配置需要额外考虑安全属性。安全中断通常被赋予更高优先级,以确保安全事件能够及时响应。同时,ICC_BPR1_EL1 寄存器控制抢占边界,决定哪些优先级的中断可以嵌套。
// 示例:配置一个安全中断的优先级
// 假设中断号 32,优先级 0x20(数值越小越高)
GICD_IPRIORITYR[32] = 0x20;
// 将其分组为 Group 0(安全)
GICD_IGROUPR[1] |= (1 << (32 % 32));
// 使能该中断
GICD_ISENABLER[1] = (1 << (32 % 32));
五、中断处理流程:从触发到返回
一个完整的中断处理流程可分为以下阶段:
- 中断触发:外设拉高中断线,GIC Distributor 采样并记录中断状态。
- 优先级仲裁:GIC 比较当前 CPU 优先级与待处理中断优先级,决定是否向 CPU 接口发送信号。
- CPU 响应:CPU 完成当前指令后,保存上下文(PSTATE、PC、寄存器),跳转到向量表对应条目。
- 中断确认:处理程序读取
ICC_IAR1_EL1获取中断号,GIC 将该中断标记为 active。 - 执行处理程序:根据中断号调用具体外设驱动或安全服务。
- 中断结束:处理程序写
ICC_EOIR1_EL1,GIC 清除 active 状态,允许后续中断。 - 上下文恢复:执行
ERET指令,恢复被中断的指令流。
在 TrustZone 中,如果中断需要跨安全边界处理,流程会更复杂:非安全世界的中断可能先被 EL3 拦截,由安全监控器决定是否转发给非安全世界。这种拦截与转发机制是安全中断路由的核心。
六、常见误区与复盘
误区一:认为所有中断都直接进入非安全世界。在 TrustZone 中,安全中断必须由安全世界处理,EL3 可以通过 SCR_EL3 寄存器拦截物理中断,防止非安全世界窃取或干扰安全事件。
误区二:忽略向量表的 EL 隔离。安全世界和非安全世界使用不同的 VBAR_EL1,若配置错误,可能导致中断处理程序跳转到错误的安全状态,引发安全漏洞。
误区三:优先级配置不当导致安全中断被延迟。安全中断应配置为较高优先级,并合理设置抢占边界,避免被大量非安全中断阻塞。
复盘建议:在调试 TrustZone 中断问题时,优先检查 GICD_IGROUPR 分组、SCR_EL3 路由位、VBAR_ELx 基地址以及 ICC_BPR1_EL1 抢占边界四个关键配置。使用 ICC_IAR1_EL1 读取中断号时,注意区分 Group 0 和 Group 1 的确认寄存器。