1. 系统模式切换
基于trust zone的系统有三种状态,安全状态、非安全状态以及用于二者切换的Monitor状态。
1. 非安全世界到Monitor模式的切换
处理器从非安全世界进入 Monitor Mode 的操作由系统严格控制,而且所有这些操作在 Monitor Mode 看来都属于异常。从非安全世界到 Monitor Mode 的操作可通过以下方式触发:
软件执行 SMC (Secure Monitor Call)指令
Monitor Mode 内执行的代码依赖于具体的实现,其功能类似于进程切换,不同的是这里是不同模式间 CPU 状态切换。软件在 Monitor Mode 下先保存当前模式的状态,然后恢复下一个模式的状态。操作完成后以从异常返回的方式开始运行下一个模式的代码。
2. 为什么安全模式和非安全模式不能直接切换?
非安模式无权访问 CP15 的 SCR 寄存器,所以无法通过设置NS来直接切换到安全模式,只能先转换到 Monitor Mode,再到安全模式。
如果软件运行在安全模式(非Monitor Mode)下,通过将 CP15 的 NS 位设置 1,安全世界可以直接跳转到非安全世界,由于此时 CPU 的流水线和寄存器还遗留了安全世界的数据和设置,非安全模式下的应用可以获取到这些数据,会有极大的安全风险。因此,只建议在 Monitor Mode 下通过设置 NS 位来切换到非安全模式。
综上,安全世界和非安全世界不存在直接的切换,所有切换操作都通过 Monitor Mode 来执行。
2. 隔离机制
除了 CPU 执行时实行安全世界和非安全世界的隔离外,AMBA3 AXI 总线提供了外设隔离的基础。
内存隔离机制
这里的内存指外部的 DDR 和片上的 ROM 以及 SRAM,其隔离和保护通过总线组件 TZASC 和 TZMA 的设置来实现。
TZASC (TrustZone Address Space Controller)可以把外部 DDR 分成多个区域,每个区域可以单独配置为安全或非安全区域,非安全的代码和应用只能访问非安全区域。TZASC 只能用于内存设备,不适合用于配置块设备,如 Nand Flash。
TZMA (TrustZone Memory Adapter)可以把片上 ROM 和 SRAM 隔离出安全和非安全区域。TZMA 最大可以将片上存储的低 2MB 配置为安全区域,其余部分配置为非安全区域。大小划分上,片上安全区域可以在芯片出厂前设置为固定大小,或运行时通过 TZPC 动态配置。TZMA 使用上有些限制,其不适用于外部内存划分,而且也只能配置一个安全区域。
外设隔离机制
外设上,基于 APB 总线的设备不支持 AXI 总线的 NS 控制信号,所以 AXI 到 APB 总线需要 AXI-to-APB bridge 设备连接,除此之外,还需要TZPC (TrustZone Protection Controller) 来向 APB 总线上的设备提供类似 AXI 上的 NS 控制信号。
由于 TZPC 可以在运行时动态设置,这就决定了外设的安全特性是动态变化的,例如键盘平时可以作为非安全的输入设备,在输入密码时可以配置为安全设备,只允许安全模式访问。
隔离机制示意图
此图来源于网上,实际上 TZPC 还连接到片内的 ROM/RAM 设备上,用于配置片上存储的安全区域。
3. 安全启动
AMBA3 AXI 总线机制隔离出安全世界和非安全世界,但这是系统启动之后的事情。如何确保系统本身是安全的呢?这就涉及到系统启动的过程。
系统上电复位后,先从安全世界开始执行。安全世界会对非安全世界的 bootloader 进行验证,确保非安全世界执行的代码经过授权而没有被篡改过。然后非安全世界的 bootloader 会加载非安全世界的 OS,完成整个系统的启动。
在非安全系统的 bootloader 加载 OS 时,仍然需要安全世界对 OS 的代码进行验证,确保没有被篡改。
图7是典型的 TrustZone 芯片的启动流程: