U-Boot 之所以要支持这么多的文件系统,最直接的原因就是为了读取存放在不同存储介质上的“下一级启动文件”(内核、设备树、ramdisk)。

简单来说,内核镜像也是一个文件。如果内核被放在了某种文件系统里,U-Boot 就必须“懂”这种文件系统,才能把它读出来。

我们可以从以下几个层面来深入理解:

1. “读取文件” vs “读取裸数据”

U-Boot 加载内核主要有两种方式,这决定了它是否需要文件系统支持:

A. 原始数据模式
  • 场景:你把内核镜像直接烧写到 Flash 的某个固定物理偏移地址(比如 0x100000)。
  • U-Boot 的操作:它不需要文件系统,只需要简单的 mmc readnand read 命令,把那一块数据搬运到内存即可。
  • 缺点:管理困难,你要记住每个文件的地址和大小,稍微错一点就覆盖了别的数据。
B. 文件系统模式
  • 场景:你把内核(uImage)、设备树(.dtb)、脚本(.scr)像在电脑上一样,拷贝到了 SD 卡或 eMMC 的某个分区里。这个分区可能是 FAT32 格式,也可能是 ext4 格式。
  • U-Boot 的操作:这时候 U-Boot 必须支持相应的文件系统驱动,才能解析目录结构,找到文件名,读取文件内容。
  • 优点:方便管理,更新内核就像复制文件一样简单,不用管物理地址。

2. 为什么需要“这么多”种类?

因为嵌入式设备的存储介质和启动流程千差万别,U-Boot 必须适应各种环境:

  • FAT32 (最常见)

    • 用途:很多开发板(如树莓派、i.MX 系列)的启动分区通常是 FAT32。
    • 原因:FAT32 简单、通用,Windows 和 Linux 都能直接读写,方便开发者把编译好的内核文件拖进去。U-Boot 必须支持 FAT 才能从这种分区启动。
  • ext4 / ext2

    • 用途:很多嵌入式 Linux 系统的根文件系统直接放在 eMMC 的 ext4 分区里。有时为了安全或性能,内核镜像也直接放在根文件系统目录下(如 /boot)。
    • 原因:如果 U-Boot 不支持 ext4,它就读不到这个分区里的内核文件。
  • UBIFS / JFFS2

    • 用途:专门针对 Raw NAND Flash 或 NOR Flash 设计的文件系统。
    • 原因:在以前没有 eMMC 的时代,内核和根文件系统都存在 NAND Flash 里。U-Boot 必须支持 UBIFS 才能从 NAND 中正确读取数据(处理坏块管理、磨损均衡等逻辑)。

3. 实际案例对比

假设你有两个不同的项目:

项目 A:树莓派风格

  • 存储:SD 卡。
  • 分区布局:第一分区是 FAT32(存放 kernel.imgbcm2710-rpi-3-b.dtb)。
  • U-Boot 需求:必须开启 CONFIG_FS_FAT。启动命令是 fatload mmc 0:1 ${kernel_addr} uImage

项目 B:工业网关风格

  • 存储:板载 eMMC。
  • 分区布局:第一分区是 ext4(存放内核),第二分区是 ext4(根文件系统)。
  • U-Boot 需求:必须开启 CONFIG_FS_EXT4。启动命令是 ext4load mmc 0:1 ${kernel_addr} /boot/uImage

4. 还有一个重要原因:灵活性

除了加载内核,U-Boot 支持文件系统还为了环境变量的保存启动脚本的灵活性:

  • 环境变量:U-Boot 的配置(如 bootargs)通常保放在 Flash 的空闲扇区,但也支持保存在 FAT 文件系统的 uboot.env 文件中,这样更安全。
  • 启动脚本:你可以写一个 boot.scr 脚本放在文件系统里,U-Boot 读取并执行它,从而实现复杂的启动逻辑切换(比如从 SD 卡启动失败则尝试从网络启动)。

总结

U-Boot 支持这么多文件系统,本质上是因为它是 PC BIOS 和 操作系统引导程序(如 GRUB)的结合体

  • 在 PC 上,BIOS 只负责硬件初始化,读取硬盘 MBR;真正的文件系统读取和内核加载是由 GRUB 完成的。
  • 在嵌入式系统中,U-Boot 一把梭了:既做硬件初始化(BIOS 的活),又做文件系统解析和内核加载(GRUB 的活)。

所以,你的内核镜像躺在哪种文件系统里,U-Boot 就得学会哪种文件系统的“语言”把它抱出来。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐