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只做基本的长度和地址合法性检查,不执行签名验证,因此启动更快,但无法防止固件被替换。

nRF54 启动ROM 与固件加载路径 启动ROM(固化) ① 硬件初始化 时钟/电源/安全子系统 ② 启动模式判定 读取OTP/UICR配置 ③ 镜像获取与校验 解析头部/签名验证 ④ 跳转至入口 移交CPU控制权 校验失败 → 锁定 不执行用户代码 固件镜像结构 镜像头部 魔数/长度/入口/版本 安全标志/签名/哈希 启动向量表 偏移0x00:初始SP 偏移0x04:Reset Handler 代码段 .text / .rodata 中断向量表 数据段(RAM加载) .data / .bss 初始化 执行与结果 普通启动 仅长度/地址检查 启动快,无签名验证 安全启动 KMU公钥验证签名 通过后才跳转 验证失败 进入锁定状态 需复位/恢复流程 日志/状态寄存器可读

安全启动与普通启动的硬件路径差异

普通启动与安全启动在硬件路径上的差异,主要体现在三个环节。第一是启动配置来源不同:普通启动读取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签名验证以及校验失败后的硬件锁定行为。掌握这些差异,才能在后续密钥工程中正确设计签名流程与密钥存储方案。