Skip to main content

规划主线系统的 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 分区
内容起始位置容量分区类型读取者
MBR0512 BU-Boot、Linux
u-boot-sunxi-with-spl.bin8 KiB随构建变化不进入分区表BootROM
boot.vfat16 MiB240 MiB0x0c,可启动U-Boot
rootfs.ext2(内部为 ext4)256 MiB512 MiB0x83Linux

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 的完整性。