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

五、中断处理流程:从触发到返回

一个完整的中断处理流程可分为以下阶段:

  1. 中断触发:外设拉高中断线,GIC Distributor 采样并记录中断状态。
  2. 优先级仲裁:GIC 比较当前 CPU 优先级与待处理中断优先级,决定是否向 CPU 接口发送信号。
  3. CPU 响应:CPU 完成当前指令后,保存上下文(PSTATE、PC、寄存器),跳转到向量表对应条目。
  4. 中断确认:处理程序读取 ICC_IAR1_EL1 获取中断号,GIC 将该中断标记为 active。
  5. 执行处理程序:根据中断号调用具体外设驱动或安全服务。
  6. 中断结束:处理程序写 ICC_EOIR1_EL1,GIC 清除 active 状态,允许后续中断。
  7. 上下文恢复:执行 ERET 指令,恢复被中断的指令流。

在 TrustZone 中,如果中断需要跨安全边界处理,流程会更复杂:非安全世界的中断可能先被 EL3 拦截,由安全监控器决定是否转发给非安全世界。这种拦截与转发机制是安全中断路由的核心。

TrustZone 中断处理流程与 GIC 结构 外设 UART / Timer / GPIO 触发中断信号 GIC Distributor 优先级仲裁 / 分组 Group 0 / Group 1 Redistributor 每核一个 SGI / PPI 管理 CPU Interface ACK / EOI 优先级屏蔽 安全世界 (Secure) 非安全世界 (Non-Secure) EL3 安全监控器 SCR_EL3.IRQ/FIQ 中断拦截与转发 EL1 安全内核 VBAR_EL1 (安全) 安全中断处理 EL1 非安全内核 VBAR_EL1 (非安全) 普通中断处理 EL0 用户态 中断处理流程(7 个阶段) 1. 触发 外设拉高 2. 仲裁 优先级比较 3. 响应 保存上下文 4. 确认 读 IAR 5. 处理 执行 ISR 6. 结束 写 EOIR 7. 返回 ERET 安全中断由 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 的确认寄存器。