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 解析配置映像的入口。它定义了整个映像的元数据与布局。其关键字段如下:

偏移量字段名称长度(字节)描述
0x00Magic Number4固定值 0x4A6F686E,用于标识有效映像头
0x04Image Length4整个 POF 文件的总长度(包括头与所有分区)
0x08Partition Count2映像中包含的分区数量
0x0AFlags2控制位:安全启动使能、双镜像使能、回滚保护等
0x0CPartition Table Offset4分区表在 POF 文件中的起始偏移地址
0x10Reserved16保留字段,用于未来扩展
0x20Image Signature可变可选:整个映像的数字签名(安全启动时使用)
关键检查点: SDM 上电后首先读取 Magic Number 验证映像头有效性。若 Magic Number 不匹配,SDM 会立即停止加载并进入错误状态。因此,任何手动修改 POF 文件的操作都必须保持 Magic Number 不变。

4.3 分区表(Partition Table)

分区表紧跟在映像头之后,是一个描述每个分区位置、类型与属性的条目数组。每个分区表条目固定为 32 字节,结构如下:

偏移量字段名称长度(字节)描述
0x00Partition ID4分区唯一标识符(如 0x01 表示配置数据)
0x04Partition Offset4该分区数据在 POF 文件中的起始偏移
0x08Partition Length4该分区数据的长度(字节)
0x0CPartition Type1分区类型:0x00 配置数据、0x01 固件、0x02 校准数据
0x0DHash Type1哈希算法:0x00 无、0x01 SHA256、0x02 SHA384
0x0EFlags2分区属性:可执行、可回滚、加密等
0x10Partition Hash16/32/48该分区的哈希值(用于完整性校验)

4.4 配置映像整体结构图

下图展示了 POF 文件从映像头到分区数据的完整层级关系:

Agilex POF 配置映像结构图 POF 配置映像结构图 映像头 (Image Header) Magic Number | Image Length | Partition Count | Flags | Partition Table Offset | Signature 分区表 (Partition Table) 条目 0: Partition ID | Offset | Length | Type | Hash 条目 1: ... | 条目 2: ... | 条目 N: ... 分区数据 (Partition Data) 分区 0 配置比特流 (FPGA 配置数据) 分区 1 固件映像 (SDM / HPS 固件) 分区 2 校准数据 (I/O 时序校准)

4.5 双镜像与分区表的关系

在双镜像安全启动场景中,分区表承担了更重要的角色。每个镜像(主镜像与备份镜像)都拥有独立的映像头与分区表。SDM 通过分区表中的 Flags 字段识别当前分区是否属于主镜像或备份镜像,并据此决定加载顺序。

双镜像分区表设计要点:
  • 主镜像与备份镜像的分区表结构必须完全一致,仅分区数据内容可能不同。
  • 备份镜像的分区表偏移量由主映像头中的 Backup Image Offset 字段指定。
  • SDM 在验证主镜像失败后,自动跳转到备份镜像的分区表重新加载。

4.6 分区表解析流程(SDM 视角)

SDM 在启动过程中解析分区表的典型步骤如下:

  1. 读取映像头:从 Flash 起始地址读取 Magic Number 验证有效性。
  2. 获取分区表偏移:从映像头中提取 Partition Table Offset 字段。
  3. 遍历分区条目:根据 Partition Count 循环读取每个 32 字节的条目。
  4. 校验分区哈希:对每个分区数据计算哈希,与条目中的 Partition Hash 比对。
  5. 加载有效分区:将校验通过的分区数据加载到对应目标(FPGA 配置、固件运行区等)。
  6. 错误处理:若某分区校验失败,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 解析分区表的日志,包括每个分区的偏移、长度与哈希校验结果。这是定位配置映像结构问题的最直接手段。