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 镜像正常启动。
- 镜像分发与接收: 主机通过 JTAG、SPI 或 PCIe 等接口将新的固件镜像(.jic / .pof 文件)传输至 SDM 的临时缓冲区。
- 数字签名验证: SDM 使用内置的 RSA-4096 公钥对镜像的签名进行完整性校验。若签名无效,立即终止升级并返回错误码。
- 镜像写入 Update 分区: 验证通过后,SDM 将新固件写入 QSPI Flash 的 Update Image 区域。写入过程中持续进行 CRC 校验。
- 元数据更新: 更新固件版本号、启动计数器、校验和等元数据,标记 Update 分区为“待验证”状态。
- 软复位与启动切换: SDM 执行软复位,从 Update 分区加载新固件。若加载成功且运行正常,则标记 Update 分区为“已验证”。
- 回滚触发条件: 若新固件连续启动失败达到预设阈值(通常为 3 次),SDM 自动回退至 Golden 分区启动。
升级安全边界: 整个升级过程中,Golden 分区始终处于硬件写保护状态。只有通过 Intel 签名的安全更新包才能修改 Golden 分区内容,这通常用于修复出厂固件的严重安全漏洞。
3.3 双镜像启动决策逻辑
SDM 上电后,启动加载器(Boot ROM)按照以下优先级和容错逻辑选择启动镜像:
3.4 容错设计关键机制
双镜像架构的容错能力依赖于以下四个核心机制的协同工作:
| 容错机制 | 实现方式 | 保护场景 |
|---|---|---|
| 镜像隔离 | 物理分区 + 硬件写保护寄存器 | 升级过程中断电,Golden 分区不受影响 |
| 签名验证 | RSA-4096 + SHA-384 数字签名 | 防止恶意固件或传输损坏的镜像被写入 |
| 启动计数 | 非易失性计数器,记录连续启动失败次数 | 新固件存在逻辑缺陷导致无法正常启动 |
| 看门狗定时器 | 硬件 WDT,固件需在超时前喂狗 | 固件执行过程中死锁或陷入死循环 |
关键约束: 启动计数器存储在 OTP(一次性可编程)或专用非易失性寄存器中。一旦连续失败次数达到硬件阈值(通常为 3-5 次),SDM 将永久锁定 Update 分区,仅允许从 Golden 分区启动。此机制防止了“反复尝试-反复失败”的无限循环。
3.5 升级失败恢复流程
当升级过程发生异常时,SDM 按照以下预定义路径自动恢复:
- 阶段一(写入中断): 若在写入 Update 分区过程中断电或通信中断,SDM 下次启动时检测到 Update 分区校验和不匹配,直接跳过并启动 Golden 分区。
- 阶段二(启动失败): 若新固件成功写入但无法正常启动(例如外设初始化失败),看门狗超时触发复位,启动计数器递增。达到阈值后,SDM 自动切换至 Golden 分区。
- 阶段三(手动回滚): 用户可通过特定 GPIO 电平组合或 JTAG 命令强制指定从 Golden 分区启动,用于调试或紧急恢复。
3.6 双镜像升级的工程实践要点
最佳实践:
- 始终保留 Golden 分区的原始备份,并确保其经过完整签名验证。
- 升级前通过
qspi_verify命令校验当前 Update 分区的完整性。 - 设置合理的启动计数器阈值(推荐 3 次),避免因瞬时故障导致永久锁定。
- 在量产阶段,将 Golden 分区设置为硬件只读,防止生产过程中的误写入。
常见陷阱:
- 升级过程中复位 SDM 可能导致 Update 分区处于“部分写入”状态,下次启动时 Golden 分区会正常启动,但 Update 分区需要重新擦除并写入。
- 不要试图通过修改启动计数器来绕过失败锁定机制——计数器存储在 OTP 区域,一旦锁定无法重置。
- Golden 分区更新必须使用 Intel 签名的安全更新包,普通升级流程无法修改 Golden 分区。