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 接管并转发到对应安全分区。

核心原则:NSPE 永远不直接触碰安全内存、安全外设和安全密钥;所有跨域访问都必须经过 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 接口构建。一个典型的跨域服务调用流程如下:

  1. NSPE 应用调用 psa_call(),传入服务 ID 和参数。
  2. 触发安全异常,CPU 切换到安全状态,SPM 的异常处理入口接管。
  3. SPM 根据服务 ID 查找目标安全分区,检查调用者权限与参数合法性。
  4. SPM 将请求投递到目标分区的消息队列,触发分区调度。
  5. 安全分区执行服务逻辑,可能访问安全存储、加密引擎或安全外设。
  6. 分区返回结果,SPM 将结果写回 NSPE 可见的共享内存或寄存器。
  7. CPU 返回非安全状态,NSPE 的 psa_call() 返回状态码。

这一流程中,SPM 既是“路由器”也是“守门人”。它不实现具体安全服务,但决定谁可以调用谁、以什么权限调用、调用结果如何回传。

TF-M 软件架构与跨域服务调用流程 NSPE 非安全处理环境 非安全应用 / RTOS psa_connect / psa_call PSA Client API SVC / 异常触发 共享内存 / 消息缓冲 非安全可见数据区 安全边界(TrustZone 状态切换) SPE 安全处理环境 SPM 安全分区管理器 服务路由 · 权限检查 · 分区调度 · IPC 转发 · 内存隔离配置 Crypto 分区 PSA Crypto 密钥管理 加解密引擎 独立栈 / 数据段 Secure Storage 分区 PSA ITS / PS 内部可信存储 外部 Flash 保护 独立栈 / 数据段 Attestation 分区 初始证明 令牌生成 设备身份 独立栈 / 数据段 平台分区 安全启动 电源 / 时钟 安全外设 独立栈 / 数据段 psa_call 请求 返回结果 / 状态码 SPM 负责路由与隔离,安全分区独立运行,NSPE 仅通过 PSA API 发起受控调用

四、典型场景:安全存储服务调用

假设 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 服务表严格一致
调试跨域调用时,优先确认三件事:服务 ID 是否匹配、分区 manifest 是否声明了对应服务、NSPE 是否链接了正确的 PSA Client 接口。多数“调用失败”并非算法问题,而是路由或权限配置问题。
修改分区 manifest 后必须重新生成 SPM 服务表并重新编译 SPE 镜像;只改 NSPE 侧代码不会生效。若出现 HardFault 或安全异常反复触发,应检查共享内存地址是否落在非安全可访问区域。

掌握 TF-M 软件架构,本质上是在脑中建立一张“请求—路由—执行—返回”的跨域地图。SPE 与 NSPE 的边界由 TrustZone 硬件保证,SPM 是边界上的唯一通道,分区模型则把安全能力拆成可管理、可隔离、可裁剪的服务单元。理解这三者的协作方式,后续移植与启动工程中的配置、裁剪和排障都会变得有据可依。