2. SDM固件组成:分区结构与职责
Secure Device Manager(SDM)是Agilex SoC FPGA中负责安全启动、固件升级和系统管理的核心硬件模块。SDM固件并非单一二进制文件,而是由多个具有明确职责的分区构成。理解这些分区的结构与功能,是掌握双镜像安全启动与固件升级流程的基础。
2.1 SDM固件分区总览
SDM固件在物理存储(如QSPI Flash)上采用分区布局,从上电复位到固件加载执行,遵循严格的层级依赖关系。整个固件体系分为三个主要分区:Boot ROM、Bootloader 和 Firmware。
| 分区名称 | 存储位置 | 可更新性 | 核心职责 |
|---|---|---|---|
| Boot ROM | SDM内部Mask ROM(掩膜只读存储器) | 不可更新(硬件固化) | 芯片上电后的第一条指令执行;硬件初始化;验证并加载Bootloader |
| Bootloader | QSPI Flash(或NAND/NOR)的固定起始区域 | 可更新(需安全签名) | 初始化外部存储器;验证并加载Firmware;提供恢复与回退逻辑 |
| Firmware | QSPI Flash(主镜像与备份镜像区域) | 可更新(双镜像机制) | 实现SDM运行时服务:配置FPGA、管理HPS复位、处理升级请求、执行安全策略 |
关键概念: Boot ROM 是信任根(Root of Trust, RoT),其代码由芯片制造商在流片时写入,无法被篡改。整个安全启动链的信任基础建立在Boot ROM的不可变性之上。
2.2 分区职责详解
2.2.1 Boot ROM — 不可变的信任根
Boot ROM是SDM固件启动的第一阶段。芯片上电或复位后,SDM硬件直接跳转到Boot ROM的起始地址执行。其职责包括:
- 最小硬件初始化: 配置SDM内部时钟、复位状态、基本安全引擎(如SHA/ECC加速器)。
- Bootloader定位与加载: 从预定义的QSPI Flash偏移地址(通常为0x0000_0000)读取Bootloader头部和镜像。
- Bootloader完整性验证: 使用硬件加速器验证Bootloader的数字签名(RSA/ECDSA)和哈希值。验证失败则进入安全错误状态。
- 安全策略实施: 检查安全熔丝(eFuse)状态,决定是否允许调试接口或非安全启动。
2.2.2 Bootloader — 固件加载器与恢复代理
Bootloader是Boot ROM与主Firmware之间的桥梁。它由Boot ROM验证通过后加载到SDM内部SRAM中执行。其职责包括:
- 外部存储器初始化: 配置QSPI控制器、时钟频率和I/O引脚,确保可以访问Flash。
- Firmware镜像选择: 读取双镜像区域的状态标志(如版本号、校验状态),决定加载主镜像还是备份镜像。
- Firmware验证: 验证Firmware镜像的签名和哈希,确保镜像未被篡改且来源可信。
- 恢复与回退逻辑: 如果主镜像验证失败,自动尝试加载备份镜像;若备份镜像也失败,则进入固件恢复模式(等待外部升级)。
安全注意: Bootloader本身必须经过Boot ROM的签名验证。如果Bootloader被破坏或替换为恶意版本,整个安全启动链将失效。因此,Bootloader的更新必须通过安全升级流程(如经签名的固件升级包)进行。
2.2.3 Firmware — SDM运行时服务
Firmware是SDM固件的主体,负责所有运行时功能。它由Bootloader验证通过后加载并执行。其职责包括:
- FPGA配置管理: 解析FPGA位流(Bitstream),通过配置总线(如Avalon-ST)将位流加载到FPGA核心。
- HPS(Hard Processor System)复位与启动: 控制HPS的复位序列,加载HPS的早期启动代码(如U-Boot SPL)。
- 固件升级服务: 接收并处理来自主机(通过JTAG、SPI或PCIe)的固件升级请求,执行镜像写入、校验和激活操作。
- 安全策略执行: 管理安全熔丝、密钥存储、防回滚保护(Rollback Protection)和生命周期状态。
- 错误处理与日志: 记录启动过程中的错误状态,提供调试接口。
2.3 SDM固件分区启动流程
下图展示了从芯片上电到Firmware运行完成的完整启动流程,清晰体现了三个分区的协作关系。
2.4 分区职责对比总结
下表从多个维度对比三个分区的关键差异,帮助理解各自在安全启动体系中的角色。
| 对比维度 | Boot ROM | Bootloader | Firmware |
|---|---|---|---|
| 存储介质 | Mask ROM(芯片内部) | QSPI Flash(外部) | QSPI Flash(外部) |
| 代码大小 | 通常 < 64 KB | 通常 64 KB ~ 256 KB | 通常 256 KB ~ 2 MB |
| 更新方式 | 不可更新 | 安全升级包(需签名) | 双镜像升级(主/备切换) |
| 验证对象 | 验证Bootloader | 验证Firmware | 验证FPGA位流与HPS代码 |
| 失败后果 | 芯片无法启动(硬件失效) | 进入恢复模式 | 回退到备份镜像 |
| 安全等级 | 最高(不可篡改) | 高(受签名保护) | 高(受签名与双镜像保护) |
设计要点: 在Agilex双镜像安全启动方案中,Bootloader负责实现镜像选择逻辑。开发者需要在Bootloader中维护一个“镜像状态表”,记录主镜像和备份镜像的版本号、校验结果和激活计数。Firmware升级完成后,通过更新该状态表来触发下一次启动时的镜像切换。