3. SDM固件升级原理:基于双镜像(Golden/Update)的固件升级机制与容错设计

3.1 双镜像架构概述

Agilex SoC 的 SDM(Secure Device Manager)固件采用 双镜像(Dual-Image) 存储架构,从根本上解决了固件升级过程中因意外断电、传输错误或镜像损坏导致的设备变砖风险。该架构将固件存储区域划分为两个独立的镜像分区:Golden Image(金镜像) 和 Update Image(更新镜像)。

核心设计思想: 始终保留一个已知良好的固件副本(Golden),作为升级失败时的安全回退点。更新操作仅在 Update 分区进行,绝不覆盖 Golden 分区。
特性 Golden Image(金镜像) Update Image(更新镜像)
角色 出厂固件 / 安全回退基准 升级目标 / 新固件载体
可写性 仅限安全更新流程(受签名保护) 常规升级流程可写入
启动优先级 次优先(当 Update 无效时启动) 最高优先(正常情况首选启动)
保护级别 硬件写保护 + 数字签名验证 数字签名验证
存储位置 QSPI Flash 固定偏移地址 QSPI Flash 固定偏移地址

3.2 双镜像升级流程

SDM 固件升级遵循 “先校验、后写入、再切换” 的原子化操作序列,确保在任何异常步骤中断时,系统仍可从 Golden 镜像正常启动。

  1. 镜像分发与接收: 主机通过 JTAG、SPI 或 PCIe 等接口将新的固件镜像(.jic / .pof 文件)传输至 SDM 的临时缓冲区。
  2. 数字签名验证: SDM 使用内置的 RSA-4096 公钥对镜像的签名进行完整性校验。若签名无效,立即终止升级并返回错误码。
  3. 镜像写入 Update 分区: 验证通过后,SDM 将新固件写入 QSPI Flash 的 Update Image 区域。写入过程中持续进行 CRC 校验。
  4. 元数据更新: 更新固件版本号、启动计数器、校验和等元数据,标记 Update 分区为“待验证”状态。
  5. 软复位与启动切换: SDM 执行软复位,从 Update 分区加载新固件。若加载成功且运行正常,则标记 Update 分区为“已验证”。
  6. 回滚触发条件: 若新固件连续启动失败达到预设阈值(通常为 3 次),SDM 自动回退至 Golden 分区启动。
升级安全边界: 整个升级过程中,Golden 分区始终处于硬件写保护状态。只有通过 Intel 签名的安全更新包才能修改 Golden 分区内容,这通常用于修复出厂固件的严重安全漏洞。

3.3 双镜像启动决策逻辑

SDM 上电后,启动加载器(Boot ROM)按照以下优先级和容错逻辑选择启动镜像:

SDM 双镜像启动决策流程图 SDM 上电启动 检查 Update 分区有效性 Update 有效? 是 从 Update 分区 加载固件 否 回退至 Golden 分区加载固件 启动 成功? 是 正常运行 标记 Update 已验证 否 启动计数器 +1 达到阈值则锁定

3.4 容错设计关键机制

双镜像架构的容错能力依赖于以下四个核心机制的协同工作:

容错机制 实现方式 保护场景
镜像隔离 物理分区 + 硬件写保护寄存器 升级过程中断电,Golden 分区不受影响
签名验证 RSA-4096 + SHA-384 数字签名 防止恶意固件或传输损坏的镜像被写入
启动计数 非易失性计数器,记录连续启动失败次数 新固件存在逻辑缺陷导致无法正常启动
看门狗定时器 硬件 WDT,固件需在超时前喂狗 固件执行过程中死锁或陷入死循环
关键约束: 启动计数器存储在 OTP(一次性可编程)或专用非易失性寄存器中。一旦连续失败次数达到硬件阈值(通常为 3-5 次),SDM 将永久锁定 Update 分区,仅允许从 Golden 分区启动。此机制防止了“反复尝试-反复失败”的无限循环。

3.5 升级失败恢复流程

当升级过程发生异常时,SDM 按照以下预定义路径自动恢复:

  1. 阶段一(写入中断): 若在写入 Update 分区过程中断电或通信中断,SDM 下次启动时检测到 Update 分区校验和不匹配,直接跳过并启动 Golden 分区。
  2. 阶段二(启动失败): 若新固件成功写入但无法正常启动(例如外设初始化失败),看门狗超时触发复位,启动计数器递增。达到阈值后,SDM 自动切换至 Golden 分区。
  3. 阶段三(手动回滚): 用户可通过特定 GPIO 电平组合或 JTAG 命令强制指定从 Golden 分区启动,用于调试或紧急恢复。
升级失败恢复路径示意图 正常升级流程 写入 Update 分区 失败检测 校验 / 超时 / 计数 可恢复 自动回退 启动 Golden 分区 不可恢复 永久锁定 Update 分区 仅允许 Golden 分区启动 需通过 JTAG 或安全更新包修复

3.6 双镜像升级的工程实践要点

最佳实践:
  • 始终保留 Golden 分区的原始备份,并确保其经过完整签名验证。
  • 升级前通过 qspi_verify 命令校验当前 Update 分区的完整性。
  • 设置合理的启动计数器阈值(推荐 3 次),避免因瞬时故障导致永久锁定。
  • 在量产阶段,将 Golden 分区设置为硬件只读,防止生产过程中的误写入。
常见陷阱:
  • 升级过程中复位 SDM 可能导致 Update 分区处于“部分写入”状态,下次启动时 Golden 分区会正常启动,但 Update 分区需要重新擦除并写入。
  • 不要试图通过修改启动计数器来绕过失败锁定机制——计数器存储在 OTP 区域,一旦锁定无法重置。
  • Golden 分区更新必须使用 Intel 签名的安全更新包,普通升级流程无法修改 Golden 分区。