Buildroot(二)
在 Buildroot 构建嵌入式 Linux 系统时,最终的固件打包(如生成 sdcard.img
或 flash.bin
)通常包含以下几个核心部分:
1. Bootloader(如 U-Boot)
- 作用:初始化硬件,加载内核和设备树。
- 打包形式:
u-boot.bin
(裸二进制文件)u-boot.img
(带头部信息的镜像,某些平台需要)
- 存储位置:通常放在存储介质的 起始扇区(如 SD 卡的
0x0
偏移)。
2. Linux 内核(Kernel)
- 作用:操作系统核心,管理硬件和进程。
- 打包形式:
zImage
(压缩的内核镜像,通用格式)uImage
(U-Boot 专用格式,带头部信息)Image
(未压缩的原始内核,某些平台使用)
- 存储位置:紧接在 Bootloader 之后(如 SD 卡的
0x8000
偏移)。
3. 设备树(Device Tree Blob, DTB)
- 作用:描述硬件配置(如 CPU、内存、外设等)。
- 打包形式:
.dtb
文件(如imx6ull-board.dtb
)。
- 存储位置:
- 与内核分开存放(如 SD 卡的
0x100000
偏移),由 U-Boot 单独加载。 - 或与内核合并(如
zImage + dtb
打包成fitImage
)。
- 与内核分开存放(如 SD 卡的
4. 根文件系统(Root Filesystem, Rootfs)
- 作用:包含用户空间程序、库、配置文件等。
- 打包形式:
- initramfs:临时内存文件系统(嵌入到内核中)。
- ext4/jffs2/squashfs:持久化文件系统镜像(如
rootfs.ext4
)。 - cpio/tar:归档格式(用于 initramfs 或 NFS 挂载)。
- 存储位置:
- 单独分区(如 SD 卡的第二个分区
/dev/mmcblk0p2
)。 - 或直接附加到内核后(initramfs)。
- 单独分区(如 SD 卡的第二个分区
5. 用户应用程序(Optional)
- 作用:自定义程序(如
/bin/helloworld
)。 - 打包形式:
- 直接编译到根文件系统中(通过 Buildroot 的
package
配置)。 - 或后期手动放入
rootfs
镜像。
- 直接编译到根文件系统中(通过 Buildroot 的
6. 其他可选组件
- SPL(Secondary Program Loader):某些平台(如 ARM)需要两级 Bootloader(
SPL + U-Boot
)。 - 启动脚本/环境变量:如 U-Boot 的
boot.scr
或env.txt
。 - 固件/驱动模块:如 WiFi 固件(
/lib/firmware
)或内核模块(.ko
文件)。
典型固件布局(以 SD 卡为例)
偏移地址 | 内容 | 文件示例 |
---|---|---|
0x0 | Bootloader (SPL) | u-boot-spl.bin |
0x40000 | U-Boot | u-boot.bin |
0x80000 | Linux 内核 | zImage |
0x200000 | 设备树 | board.dtb |
分区2 | 根文件系统 | rootfs.ext4 |
Buildroot 如何打包固件?
Buildroot 通过 自定义脚本或工具(如 genimage
)将上述组件按目标设备的存储布局打包。例如:
-
生成单个镜像文件(如
sdcard.img
):genimage -c board/your_board/genimage.cfg
- 配置文件
genimage.cfg
定义了分区表和文件填充规则。
- 输出目录结构(
output/images/
):output/images/ ├── u-boot.bin # Bootloader ├── zImage # 压缩内核 ├── board.dtb # 设备树 ├── rootfs.ext4 # 根文件系统 └── sdcard.img # 最终固件(完整镜像)
总结
Buildroot 打包的固件通常包含:
- Bootloader(如 U-Boot)
- Linux 内核(
zImage
或uImage
) - 设备树(
.dtb
) - 根文件系统(
rootfs.ext4
等) - 用户应用程序(集成在
rootfs
中)
最终固件的具体组成和布局取决于 目标硬件 和 Buildroot 配置(如 BR2_TARGET_UBOOT
、BR2_LINUX_KERNEL
等)。