3. nRF54启动ROM与固件加载
nRF54系列上电或复位后,最先运行的并不是用户固件,而是固化在芯片内部只读存储器中的启动ROM代码。这段代码由Nordic在流片时写入,用户无法修改,也不占用Flash空间。它的核心职责非常明确:建立最小可信执行环境、判断从哪个存储介质加载下一阶段镜像、校验镜像完整性,然后把控制权交给固件。理解启动ROM的职责边界,是理解nRF54安全启动与普通启动差异的起点。
启动ROM的职责与执行顺序
nRF54的启动ROM在复位释放后首先执行,其工作可以概括为四个阶段。第一阶段是硬件初始化,包括时钟源选择、电源管理单元就绪、必要的外设复位释放,以及安全子系统(如TrustZone与KMU密钥管理单元)的基础配置。第二阶段是启动模式判定,ROM会读取芯片内部的一次性可编程区域(OTP/UICR)中的启动配置字,判断本次启动是普通启动还是安全启动,以及从内部Flash、外部QSPI Flash还是串行接口加载固件。第三阶段是镜像获取与校验,ROM根据启动配置从指定介质读取固件镜像头部,解析长度、入口地址、校验字段,并在安全启动模式下执行签名验证。第四阶段是跳转,校验通过后ROM把CPU控制权交给镜像入口,启动ROM自身退出执行。
需要特别注意的是,启动ROM只负责“把可信的下一阶段代码送进CPU”,它不负责应用逻辑、不初始化复杂外设、也不管理文件系统。因此固件镜像的格式必须严格符合ROM的解析约定,否则ROM会在校验阶段直接拒绝启动。
固件镜像格式与启动向量表
nRF54的固件镜像通常由三部分组成:镜像头部、启动向量表和实际代码段。镜像头部包含魔数、镜像长度、入口地址、版本号、安全标志以及签名或哈希字段。启动向量表位于镜像起始处,前两个字分别是初始栈指针(SP)和复位向量(Reset Handler)地址,这与Cortex-M系列的异常模型一致。ROM在跳转前会读取这两个值,确认SP落在合法RAM范围内、复位向量落在镜像代码段范围内,然后才执行跳转。
在安全启动模式下,镜像头部还会携带签名信息。ROM使用存储在KMU中的公钥或公钥哈希对镜像进行验证。验证通过后,ROM才会把控制权交给镜像;验证失败则进入锁定状态,不会执行任何用户代码。普通启动模式下,ROM只做基本的长度和地址合法性检查,不执行签名验证,因此启动更快,但无法防止固件被替换。
安全启动与普通启动的硬件路径差异
普通启动与安全启动在硬件路径上的差异,主要体现在三个环节。第一是启动配置来源不同:普通启动读取OTP中的普通启动标志,安全启动读取安全启动使能位与公钥哈希槽位。第二是校验引擎参与程度不同:安全启动会激活KMU与加密加速器,对镜像头部和代码段执行哈希与签名验证;普通启动仅由ROM做软件层面的边界检查。第三是失败处理不同:普通启动校验失败通常表现为跳转到无效地址或复位循环;安全启动校验失败会触发硬件锁定,部分配置下还会擦除密钥槽,防止攻击者通过反复尝试获取信息。
从开发者视角看,这意味着安全启动模式下固件镜像必须经过签名工具处理,且签名私钥不能出现在设备端。普通启动模式下可以直接烧录未签名镜像,适合开发调试阶段,但量产设备不应使用。
实际配置与观察方法
在nRF54上配置启动模式,通常通过UICR或OTP区域写入启动配置字。以下是一个示意性的配置片段,用于说明安全启动使能与公钥槽位的选择方式:
/* 示意性配置,非实际寄存器地址 */
#define BOOT_CONFIG_SECURE_EN (1UL << 0)
#define BOOT_CONFIG_KEY_SLOT(n) ((n) << 4)
#define BOOT_CONFIG_MEDIA_QSPI (1UL << 8)
uint32_t boot_cfg = BOOT_CONFIG_SECURE_EN
| BOOT_CONFIG_KEY_SLOT(0)
| BOOT_CONFIG_MEDIA_QSPI;
/* 写入UICR启动配置区,复位后由ROM读取 */
烧录后可以通过读取状态寄存器或调试接口观察启动结果。典型判断依据包括:ROM是否跳转到镜像入口、安全启动校验是否通过、是否进入锁定状态。如果设备反复复位且无法进入用户代码,应优先检查镜像头部长度字段与实际烧录长度是否一致、签名是否与KMU中公钥匹配、启动向量表中的SP和复位向量是否落在合法地址范围。
总结来说,nRF54启动ROM是硬件信任链的起点,它按固定顺序完成初始化、模式判定、镜像校验和跳转。固件镜像的头部、启动向量表和代码段必须严格符合ROM解析约定。安全启动与普通启动的核心差异在于是否启用KMU签名验证以及校验失败后的硬件锁定行为。掌握这些差异,才能在后续密钥工程中正确设计签名流程与密钥存储方案。