除了芯片原厂以及少数方案厂商,目前大部分的产品开发几乎都不需要修改或移植U-Boot 源码,但是了解U-Boot对我们深刻理解Linux知识体系以及系统级问题排查都有极大的帮助。
1 初识 U-Boot
U-Boot(Universal Bootloader,通用引导程序)是嵌入式系统领域应用最广泛的开源引导程序,主要作用是在硬件上电后完成初始化并引导加载Linux内核。
U-Boot本质其实就是一个裸机代码。
我们可以在U-Boot 官网下载到"原汁原味"的U-Boot 源码,但实际工作中我们通常用不上,因为这是U-Boot官方为芯片原厂提供的,除非你是芯片原厂的BSP工程师。
text
U-Boot 官网下载:https://ftp.denx.de/pub/u-boot/

芯片原厂下载U-Boot 源码后,针对自家芯片专门进行移植适配,并对外发布维护一份U-Boot 源码。开发板/方案厂商又会在芯片原厂提供的U-Boot 源码基础上加入了针对自家开发板/核心板的支持。因此,U-Boot通常有如下3种:
U-Boot官方发布并维护的U-Boot 源码;
芯片原厂发布并维护的U-Boot 源码;
开发板/方案厂商发布并维护的U-Boot 源码。
我们平时做产品开发基本上使用的都是2或3。还有些开发板或方案厂商U-Boot 源码直接不开源,目的是防止他们的系统跑在别的硬件上。
2 U-Boot 配置与编译
我们编译U-Boot 源码时,通常会执行make xxx_defconfig和make这两个命令,那么它们的主要作用是什么呢?下面我们来大致了解一下这过程。
make xxx_defconfig和make是编译u-boot的两个核心步骤,分别对应 "配置" 和 "编译" 两个阶段。
make xxx_defconfig配置阶段
make xxx_defconfig:用于配置U-Boot,最主要的目的就是生成.config文件,指定硬件平台特性。
根据预设的板级配置文件(比如:rk3576_defconfig),生成 U-Boot 的核心.config配置文件,告诉编译器 "要为哪个硬件平台编译 U-Boot,需要启用哪些功能"。具体说明如下:
U-Boot 源码中包含大量针对不同硬件平台的默认配置,存储在configs/目录下。

文件名格式通常为<平台名>_defconfig。例如rk3576_defconfig对应瑞芯微RK3576开发板。

执行make rk3576_defconfig时,会将configs/rk3576_defconfig文件中的配置项(如 CPU 型号、支持的外设、功能开关等)复制到U-Boot根目录的.config文件中。
bash
make rk3576_defconfig # 为 RK3576开发板生成配置文件
为什么需要make xxx_defconfig?
由于U-Boot 支持数千种硬件平台,通过defconfig文件可以快速指定目标平台,可以避免我们手动一个个配置海量参数(如是否支持 SPI Flash、网卡型号等)。
make 编译阶段
make:根据.config配置文件编译源码,生成可执行镜像。编译器读取.config文件中的配置,决定哪些源码文件需要编译(如支持 SD 卡的驱动会被包含,不支持的功能模块会被忽略)。最终生成可烧录到硬件的U-Boot镜像(如u-boot.bin、u-boot.img、u-boot-spl.bin等)。
镜像说明:
u-boot.bin:原始二进制镜像,可直接烧录到启动介质(如 SPI Flash)。
u-boot.img:带有头部信息的镜像(包含加载地址、校验值等),适合某些 bootrom 加载。
u-boot-spl.bin:SPL(Secondary Program Loader,二级引导程序),用于初始化内存等硬件,再加载主U-Boot(部分平台需要)。
特别说明:
- 必须先执行make xxx_defconfig生成.config,才能执行make编译 ------ 否则编译器不知道要为哪个平台编译,会报错。
- 若需要调整功能(如新增对某外设的支持),可在make xxx_defconfig后执行make menuconfig(图形化配置界面)修改.config,再执行make重新编译。
- 若更换目标平台(如从 RK3576 切换到全志T527),需先执行make distclean清除旧配置和编译产物,再重新执行make <新平台>_defconfig和make。
总的来说,make xxx_defconfig像是在"定规矩"------ 告诉编译器 "为哪个硬件编译,包含哪些功能",生成配置文件。make则是"按规矩做事"------ 根据配置文件编译源码,生成最终可运行的U-Boot镜像。
3 哪些情况需做 U-Boot 移植?
在嵌入式领域,U-Boot移植(即针对特定硬件平台适配U-Boot)通常发生在硬件方案全新设计或重大变更的场景下。当现有U-Boot版本无法直接支持新硬件的核心功能时,就需要通过移植使其适配目标平台。
简单来说:只要硬件的核心架构、关键组件或启动需求与现有U-Boot不兼容,就需要移植。这通常是芯片原厂BSP工程师的活,一般不需要芯片使用者太操心,有个了解即可。
U-Boot还有两个非常核心的环境变量,我们下期聊。
(完)