4. TF-M软件架构解析
TF-M(Trusted Firmware-M)是 Arm 面向 Cortex-M 平台推出的安全固件参考实现,其核心价值在于把安全启动、安全隔离、安全服务与安全存储整合成一套可移植、可裁剪的软件架构。理解 TF-M 的软件架构,关键不是记住某个函数名,而是看清它如何把一颗 MCU 划分成两个世界:安全处理环境 SPE 与非安全处理环境 NSPE,并在两者之间通过 SPM 建立受控的服务调用通道。
一、SPE、NSPE 与 SPM 的职责边界
SPE(Secure Processing Environment)是安全侧运行环境,包含安全启动链、安全分区、安全内核调度以及安全外设访问。NSPE(Non-Secure Processing Environment)是普通应用侧运行环境,通常运行 RTOS 或裸机应用,它不能直接访问安全资源,只能通过 PSA Client API 发起服务请求。SPM(Secure Partition Manager)是 SPE 内部的管理核心,负责安全分区生命周期、服务路由、隔离策略和 IPC 调度。
三者关系可以概括为:NSPE 是“请求方”,SPM 是“服务网关与调度器”,SPE 中的安全分区是“服务提供方”。NSPE 调用 psa_connect()、psa_call()、psa_close() 等接口时,实际触发的是跨安全边界的异常或 SVC,由 SPM 接管并转发到对应安全分区。
二、分区模型:从“大安全固件”到“可隔离服务”
TF-M 的分区模型是架构解析的重点。传统安全固件常把所有安全功能写在一个大镜像里,而 TF-M 把安全功能拆成多个安全分区(Secure Partition),每个分区拥有独立的栈、堆、数据段和 manifest 声明。分区之间默认隔离,只有通过 SPM 授权的服务调用才能交互。
分区模型带来三个直接收益:第一,故障隔离,某个安全服务崩溃不会拖垮整个 SPE;第二,权限最小化,每个分区只声明自己需要的外设和内存;第三,可裁剪,产品可以按需选择加密、存储、 attestation 等服务。分区 manifest 通常以 YAML 或 JSON 描述,编译时生成分区元数据,运行时由 SPM 加载。
{
"name": "TFM_SP_CRYPTO",
"type": "PSA-ROT",
"priority": "NORMAL",
"services": [
{ "name": "PSA_CRYPTO", "sid": "0x00000001" }
],
"mmio": [ { "region": "CRYPTO_BASE", "permission": "READ_WRITE" } ]
}
上面的 manifest 片段表达了分区名称、类型、优先级、服务 ID 以及允许访问的 MMIO 区域。SPM 在启动阶段解析这些信息,建立服务表与内存保护配置。
三、服务框架与组件交互流程
TF-M 的服务框架围绕 PSA Certified 接口构建。一个典型的跨域服务调用流程如下:
- NSPE 应用调用
psa_call(),传入服务 ID 和参数。 - 触发安全异常,CPU 切换到安全状态,SPM 的异常处理入口接管。
- SPM 根据服务 ID 查找目标安全分区,检查调用者权限与参数合法性。
- SPM 将请求投递到目标分区的消息队列,触发分区调度。
- 安全分区执行服务逻辑,可能访问安全存储、加密引擎或安全外设。
- 分区返回结果,SPM 将结果写回 NSPE 可见的共享内存或寄存器。
- CPU 返回非安全状态,NSPE 的
psa_call()返回状态码。
这一流程中,SPM 既是“路由器”也是“守门人”。它不实现具体安全服务,但决定谁可以调用谁、以什么权限调用、调用结果如何回传。
四、典型场景:安全存储服务调用
假设 NSPE 应用需要保存一个设备密钥。它调用 psa_its_set(),该调用进入 PSA Client API,触发安全异常。SPM 根据服务 ID 找到 Secure Storage 分区,检查调用者是否有权限访问该 UID。Secure Storage 分区执行写入逻辑,可能调用 Crypto 分区做加密,再写入内部 Flash 或外部安全存储。完成后结果沿原路返回。
这个场景中,NSPE 只看到“设置成功”或“权限拒绝”,看不到密钥明文、加密算法和存储位置。这正是分区模型与 SPM 协同带来的安全抽象。
五、常见误区与复盘要点
| 误区 | 正确理解 |
|---|---|
| SPM 就是安全服务本身 | SPM 是管理器和路由器,具体服务由安全分区实现 |
| NSPE 可以直接访问安全外设 | 必须通过 SPM 路由,且分区 manifest 需声明 MMIO 权限 |
| 所有安全功能应放在一个分区 | 应按服务边界拆分,获得故障隔离与最小权限 |
| 分区越多越好 | 分区过多会增加 IPC 开销和内存占用,需权衡 |
| 服务 ID 可以随意分配 | 服务 ID 需与 manifest 和 SPM 服务表严格一致 |
掌握 TF-M 软件架构,本质上是在脑中建立一张“请求—路由—执行—返回”的跨域地图。SPE 与 NSPE 的边界由 TrustZone 硬件保证,SPM 是边界上的唯一通道,分区模型则把安全能力拆成可管理、可隔离、可裁剪的服务单元。理解这三者的协作方式,后续移植与启动工程中的配置、裁剪和排障都会变得有据可依。