4、配置映像结构:配置映像文件格式(RBF、POF)、映像头(Image Header)、分区表
Agilex SoC 的配置映像并非单一二进制文件,而是一个严格分层的结构化数据集合。理解其文件格式、映像头与分区表,是掌握 SDM 配置流程与安全启动的基础。本章将逐一拆解这三个核心要素。
4.1 配置映像文件格式:RBF 与 POF
Agilex 支持两种主要的配置映像文件格式,分别对应不同的使用场景:
| 特性 | RBF (Raw Binary File) | POF (Programmer Object File) |
|---|---|---|
| 本质 | 纯二进制数据流,无额外封装 | 包含元数据、校验和、多分区结构的容器格式 |
| 用途 | 早期调试、直接烧录到 Flash 的原始区域 | 量产编程、安全启动、双镜像管理 |
| 结构 | 连续的比特流,无分区表 | 包含映像头、分区表、多个分区数据 |
| 安全性 | 不支持认证加密 | 支持签名认证与加密 |
| 生成工具 | Quartus 直接生成 | Quartus 或 bootloader-generator 工具 |
开发建议: 在原型验证阶段可使用 RBF 快速迭代;进入量产或需要安全启动功能时,必须切换至 POF 格式。POF 是 Agilex SDM 安全启动流程的标准输入。
4.2 映像头(Image Header)
映像头位于 POF 文件的最前端,是 SDM 解析配置映像的入口。它定义了整个映像的元数据与布局。其关键字段如下:
| 偏移量 | 字段名称 | 长度(字节) | 描述 |
|---|---|---|---|
| 0x00 | Magic Number | 4 | 固定值 0x4A6F686E,用于标识有效映像头 |
| 0x04 | Image Length | 4 | 整个 POF 文件的总长度(包括头与所有分区) |
| 0x08 | Partition Count | 2 | 映像中包含的分区数量 |
| 0x0A | Flags | 2 | 控制位:安全启动使能、双镜像使能、回滚保护等 |
| 0x0C | Partition Table Offset | 4 | 分区表在 POF 文件中的起始偏移地址 |
| 0x10 | Reserved | 16 | 保留字段,用于未来扩展 |
| 0x20 | Image Signature | 可变 | 可选:整个映像的数字签名(安全启动时使用) |
关键检查点: SDM 上电后首先读取 Magic Number 验证映像头有效性。若 Magic Number 不匹配,SDM 会立即停止加载并进入错误状态。因此,任何手动修改 POF 文件的操作都必须保持 Magic Number 不变。
4.3 分区表(Partition Table)
分区表紧跟在映像头之后,是一个描述每个分区位置、类型与属性的条目数组。每个分区表条目固定为 32 字节,结构如下:
| 偏移量 | 字段名称 | 长度(字节) | 描述 |
|---|---|---|---|
| 0x00 | Partition ID | 4 | 分区唯一标识符(如 0x01 表示配置数据) |
| 0x04 | Partition Offset | 4 | 该分区数据在 POF 文件中的起始偏移 |
| 0x08 | Partition Length | 4 | 该分区数据的长度(字节) |
| 0x0C | Partition Type | 1 | 分区类型:0x00 配置数据、0x01 固件、0x02 校准数据 |
| 0x0D | Hash Type | 1 | 哈希算法:0x00 无、0x01 SHA256、0x02 SHA384 |
| 0x0E | Flags | 2 | 分区属性:可执行、可回滚、加密等 |
| 0x10 | Partition Hash | 16/32/48 | 该分区的哈希值(用于完整性校验) |
4.4 配置映像整体结构图
下图展示了 POF 文件从映像头到分区数据的完整层级关系:
4.5 双镜像与分区表的关系
在双镜像安全启动场景中,分区表承担了更重要的角色。每个镜像(主镜像与备份镜像)都拥有独立的映像头与分区表。SDM 通过分区表中的 Flags 字段识别当前分区是否属于主镜像或备份镜像,并据此决定加载顺序。
双镜像分区表设计要点:
- 主镜像与备份镜像的分区表结构必须完全一致,仅分区数据内容可能不同。
- 备份镜像的分区表偏移量由主映像头中的 Backup Image Offset 字段指定。
- SDM 在验证主镜像失败后,自动跳转到备份镜像的分区表重新加载。
4.6 分区表解析流程(SDM 视角)
SDM 在启动过程中解析分区表的典型步骤如下:
- 读取映像头:从 Flash 起始地址读取 Magic Number 验证有效性。
- 获取分区表偏移:从映像头中提取
Partition Table Offset字段。 - 遍历分区条目:根据
Partition Count循环读取每个 32 字节的条目。 - 校验分区哈希:对每个分区数据计算哈希,与条目中的
Partition Hash比对。 - 加载有效分区:将校验通过的分区数据加载到对应目标(FPGA 配置、固件运行区等)。
- 错误处理:若某分区校验失败,SDM 根据 Flags 决定是否回滚到备份镜像。
// 伪代码:SDM 分区表解析逻辑
for (int i = 0; i < partition_count; i++) {
partition_entry_t entry = read_partition_entry(partition_table_offset + i * 32);
if (verify_partition_hash(entry) == PASS) {
load_partition(entry);
} else {
if (entry.flags & FLAG_BACKUP_AVAILABLE) {
switch_to_backup_image();
} else {
report_error(ERROR_PARTITION_HASH_MISMATCH);
}
}
}
4.7 常见配置错误与避坑
| 错误场景 | 后果 | 解决方案 |
|---|---|---|
| 分区表偏移指向无效地址 | SDM 无法找到分区数据,启动卡死 | 使用 Quartus 或 bootloader-generator 重新生成 POF |
| 分区哈希与实际数据不匹配 | 安全启动校验失败,拒绝加载 | 确保分区数据生成后未被篡改,重新计算哈希 |
| 双镜像分区表结构不一致 | 主镜像回滚后备份镜像无法解析 | 保持主/备镜像的分区表条目数、类型、顺序完全一致 |
| Magic Number 被覆盖 | SDM 无法识别映像头,进入安全模式 | 编程时保留 Flash 起始 4 字节不变 |
调试技巧: 使用 Intel 提供的
sdm_debug 工具可以实时打印 SDM 解析分区表的日志,包括每个分区的偏移、长度与哈希校验结果。这是定位配置映像结构问题的最直接手段。