4. 开发环境搭建

Trusted Firmware-M(TF-M)是面向 Armv8-M 架构的安全固件参考实现,其构建过程涉及多套工具链、Python 脚本、CMake 构建系统以及平台相关的配置。一个可复现的开发环境是后续移植、调试与测试的基础。本节从工具链、源码、编译系统、模拟器与硬件平台五个维度,梳理一条可落地的环境搭建路径。

一、核心原理:TF-M 构建依赖的三层结构

TF-M 的构建并非单一编译器完成,而是由三层协作:最底层是交叉编译工具链,负责生成 Cortex-M 目标代码;中间层是 CMake 与 Python 脚本,负责配置、生成链接脚本与签名镜像;最上层是平台与配置,决定使用哪块硬件或模拟器、启用哪些安全服务。理解这三层,才能快速定位“编译失败”究竟出在哪一层。

TF-M 开发环境三层依赖关系 平台与配置层 目标平台:AN547 / AN552 / STM32L562 / nRF9160 / LPC55S69 / Musca-B1 配置项:TFM_PLATFORM、TFM_PROFILE、TFM_PSA_API、BUILD_TYPE 构建系统层 CMake ≥ 3.15 + Ninja/Make + Python 3.7+(pycryptodome、cryptography、jinja2) 脚本:tools/tfm_parse_manifest_list.py、bl2/ext/mcuboot 签名、imgtool 工具链层 Arm GNU Toolchain(arm-none-eabi-gcc)或 Arm Compiler 6(armclang) 辅助工具:GNU Make、Git、CMake、SRecord、OpenOCD / pyOCD 配置驱动 调用编译

二、工具链安装:GCC 与 Arm Compiler 的选择

TF-M 官方推荐使用 Arm GNU Toolchain(arm-none-eabi-gcc)进行开源构建,版本建议 10.3 及以上。若使用 Arm Compiler 6,则需注意其许可证与 CMake 工具链文件的差异。安装后务必验证版本与目标架构支持:

# 下载并解压 Arm GNU Toolchain
tar -xjf gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2 -C /opt/
export PATH=/opt/gcc-arm-none-eabi-10.3-2021.10/bin:$PATH

# 验证
arm-none-eabi-gcc --version
arm-none-eabi-gcc -mcpu=cortex-m33 -mthumb -print-multi-lib

Python 依赖同样关键。TF-M 的 manifest 解析、密钥生成与镜像签名均依赖 Python 包。建议使用虚拟环境隔离:

python3 -m venv tfm-venv
source tfm-venv/bin/activate
pip install pycryptodome cryptography jinja2 cbor2 pyyaml

三、源码获取与目录结构

TF-M 源码托管于 trustedfirmware.org 的 Gerrit 与 GitHub 镜像。推荐使用 Git 克隆并同步子模块,因为 BL2、MCUboot、CMSIS、Mbed TLS 等均以子模块形式存在:

git clone https://git.trustedfirmware.org/TF-M/trusted-firmware-m.git
cd trusted-firmware-m
git submodule update --init --recursive
git checkout TF-Mv1.8.0

克隆完成后,重点关注以下目录:platform/ 存放各硬件平台适配;config/ 存放构建配置;secure_fw/ 是安全服务核心;bl2/ 是引导加载程序;tools/ 是构建脚本。理解目录职责,能显著减少“找不到文件”的困惑。

四、编译系统:CMake 配置与构建流程

TF-M 使用 CMake 作为顶层构建系统,通过 -DTFM_PLATFORM 指定平台,通过 -DTFM_TOOLCHAIN_FILE 指定工具链文件。典型构建命令如下:

cmake -S . -B build -G Ninja \
  -DTFM_PLATFORM=arm/mps2/an521 \
  -DTFM_TOOLCHAIN_FILE=toolchain_GNUARM.cmake \
  -DCMAKE_BUILD_TYPE=Debug \
  -DTFM_PROFILE=profile_medium \
  -DTEST_NS=ON -DTEST_S=ON

cmake --build build -- install

构建产物通常包括:tfm_s.bin(安全固件)、tfm_ns.bin(非安全应用)、bl2.bin(引导程序)以及合并后的 tfm_s_ns_signed.bin。若构建失败,优先检查 CMake 版本、Python 包是否齐全、子模块是否完整。

建议首次构建使用 TFM_PROFILE=profile_medium,它包含 PSA Crypto、Internal Trusted Storage、Attestation 等常用服务,兼容性最好。

五、模拟器与硬件平台选择

没有硬件时,可使用 Arm FVP(Fixed Virtual Platform)模拟器运行 TF-M。FVP 支持 MPS2 AN521、AN547 等模型,适合功能验证与 CI。硬件平台则适合真实功耗、外设与安全启动测试。选择时需权衡成本、调试能力与社区支持。

平台 类型 典型用途 调试接口
MPS2 AN521 FVP 模拟器 快速验证、CI FVP 内置
MPS3 AN547 FVP / FPGA Corstone-300 参考 FVP / JTAG
STM32L562-DK 硬件 低功耗安全应用 ST-LINK / OpenOCD
nRF9160-DK 硬件 蜂窝 IoT 安全 J-Link / pyOCD
LPC55S69-EVK 硬件 双核安全启动 LPC-Link2 / pyOCD

六、案例与误区复盘

某团队在 STM32L562 上构建 TF-M 时,CMake 报错“找不到 arm-none-eabi-gcc”。排查发现工具链已安装,但 CMake 缓存中记录了旧路径。解决方法是删除 build/ 目录并重新配置,或显式传入 -DCMAKE_C_COMPILER。另一个常见误区是忽略子模块更新,导致 MCUboot 头文件缺失。建议每次切换分支后执行 git submodule update --init --recursive。

不要混用不同版本的 GCC 与 CMake 工具链文件。TF-M 对编译器标志敏感,混用可能导致链接脚本段冲突或安全启动校验失败。

环境搭建完成后,建议先运行一次 cmake --build build -- install 并检查 build/bin/ 下是否生成完整镜像,再进入后续的配置与移植环节。一个干净、可复现的环境,是 TF-M 工程化开发的第一道保障。