规划主线系统的 eMMC 分区布局
同一块 eMMC 上,BootROM、U-Boot 和 Linux 使用的寻址方式不同。镜像布局不是为了“排得整齐”,而是让每个阶段都能按自己的规则找到下一阶段。
查看 768 MiB 镜像布局
0 8 KiB 16 MiB 256 MiB 768 MiB
│ MBR │ SPL + FIT │ boot.vfat │ rootfs.ext4 │
│ 512 B │ u-boot-sunxi-with-spl.bin │ 240 MiB │ 512 MiB │
└──────────┴─────────────────────────────┴──────────────────────────────┴────────────────────────────────┘
不进入分区表 MBR 第 1 分区 MBR 第 2 分区
| 内容 | 起始位置 | 容量 | 分区类型 | 读取者 |
|---|---|---|---|---|
| MBR | 0 | 512 B | — | U-Boot、Linux |
u-boot-sunxi-with-spl.bin | 8 KiB | 随构建变化 | 不进入分区表 | BootROM |
boot.vfat | 16 MiB | 240 MiB | 0x0c,可启动 | U-Boot |
rootfs.ext2(内部为 ext4) | 256 MiB | 512 MiB | 0x83 | Linux |
boot 恰好在 256 MiB 结束,rootfs 从 256 MiB 开始,因此最终 raw 大小是 768 MiB。16 MiB 与 256 MiB 是本工程的布局选择,并不是 T527 BootROM 强制要求的分区起点。
U-Boot 位于分区表之外的原因
全志 BootROM 不会解析 FAT,也不会按文件名寻找 U-Boot。它从约定的 8 KiB 裸偏移检查 eGON 头,再执行 SPL。SPL 继续从同一个组合文件中读取 FIT,FIT 内含 U-Boot proper、TF-A 和 U-Boot 设备树。
8 KiB 8 KiB + SPL 对齐长度
│ eGON SPL │ FIT
├────────────────────────┼───────────────────────
├─ U-Boot proper
├─ BL31
└─ Avaota A1 U-Boot DTB
当前校验脚本从 eGON 头读取 SPL 长度,而不是假定 FIT 永远位于固定扇区。现有一致产物中,SPL 长度为 0xc000,FIT 位于 raw 偏移 0xe000。
区分 eMMC User Area 与 Boot0
整盘 raw 由 OpenixCLI 通过 FES 从物理扇区 0 写入 eMMC User Area。启用 --emmc-boot0-from-image 后,OpenixCLI 还会从 raw 的 8 KiB 位置提取主线 SPL,并写入 eMMC Boot0。FES 按 eMMC 物理区域工作,不使用 Linux 的 /dev/mmcblkN 名称;启动到主线 Linux 后,本次实机把同一颗 eMMC 枚举为 mmcblk1。
eMMC
├── Boot0 /dev/mmcblk0boot0 安装脚本额外写入 U-Boot
└── User Area /dev/mmcblk0 MBR + 8 KiB U-Boot + boot + rootfs
两次写入服务于不同的硬件启动路径。Boot0 中有 U-Boot,不代表 User Area 的 8 KiB 位置可以为空;反过来也一样。
使用卷标定位根分区
当前 genimage.cfg 没有配置固定 MBR 磁盘签名,实际镜像的磁盘标识为 0x00000000。工程通过 ext4 卷标建立启动参数与根分区的联系:
rootfs.ext2 --卷标 rootfs--> root=LABEL=rootfs
这意味着镜像中只能有一个供本次启动使用的 rootfs 卷标。若以后改用 PARTUUID,需要同时修改 genimage、extlinux 和验证脚本;在真正修改工程前,文档不提前假设这种方案已经存在。
检查镜像容量
cd buildroot-2026.05.1
stat -c '%-38n %10s bytes' \
output/images/u-boot-sunxi-with-spl.bin \
output/images/boot.vfat \
output/images/rootfs.ext2
test "$(stat -c %s output/images/u-boot-sunxi-with-spl.bin)" \
-lt $((16 * 1024 * 1024 - 8 * 1024))
最后一条命令没有报错,只能说明组合 U-Boot 没有覆盖 16 MiB 的启动分区。后续还要使用 verify-mainline-layout.sh 检查 eGON、FIT、FAT 文件和 rootfs 的完整性。