U-Boot简介

U‑Boot = Universal Bootloader,全称 Universal Boot Loader。

官方 Wiki 主页:https://www.denx.de/wiki/U-Boot/

官方主仓库:https://source.denx.de/u-boot/u-boot

主线维护主体:德国 DENX Software Engineering(DENX)

一、U-Boot的由来

U‑Boot 不是凭空写出来的,它是多个老 bootloader 项目的合并迭代产物,源头可以一路追溯:

  1. 最早始祖:8xxROM(针对摩托罗拉 MPC8xx PowerPC)
  2. 后续衍生:PPCBoot(PowerPCBoot,专门给 PowerPC 处理器,Wolfgang Denk 主导)
  3. 分支分叉:ARMBoot(针对 ARM 架构,独立分支)

2000 年左右:嵌入式市场越来越多不同架构 CPU(PowerPC、ARM、MIPS),大家发现 PPCBoot、ARMBoot 代码大量重复、分头维护很累。

2000 年底:PPCBoot + ARMBoot 合并,改名叫 U-Boot(Universal Bootloader) 名字里 Universal 的含义:通用,支持多种 CPU 架构、多种板子,不再绑定单一处理器。

一句话起源:U-Boot 是 PPCBoot 与 ARMBoot 的融合升级版,目标做跨架构统一 bootloader。

二、U-Boot能干些什么?

U-Boot 属于 Bootloader 的其中一种,不是 ROM、不是 ATF、不是 Linux 内核。

SOC 上电启动链: BOOTROM → ATF (BL1/BL2/BL31) → SPL (uboot spl) → U-Boot Proper (uboot.bin) → Linux kernel → rootfs → 应用

U-Boot 的核心职责:硬件初始化 + 引导内核 + 调试交互

1、硬件初始化(SPL + 主 U-Boot 分工)

① SPL(Secondary Program Loader,小 U-Boot):

  • DDR 初始化、基础时钟、基础串口
  • DDR 跑起来,才能加载主 uboot 到 DDR

② U-Boot Proper:

  • 时钟、GPIO、I2C、SPI、NAND/eMMC、SD、GMAC 以太网、PHY、USB 等外设初始化
  • DM 驱动模型管理所有外设
  • 解析 DTS 设备树,获取硬件资源

注意:U-Boot 做硬件初始化,目的不是跑业务,是为了把环境准备好,给内核铺路。

2、加载并启动操作系统(最核心本职工作)

支持从非常多介质加载内核镜像: SD 卡、eMMC、NAND、SPI NOR Flash、网络 TFTP、USB、SATA。 动作:把 zImage / Image /uImage、设备树 dtb、initramfs 读到 DDR 指定地址,准备 bootargs 启动参数,最后调用 booti(ARM64)跳转到内核。

3、交互式命令行(u-boot shell)

这是 U-Boot 区别于很多极简 bootloader 最大特点: 串口控制台,提供大量命令: md/mm 内存读写、tftp网络下载、sf操作 spi flash、mmc操作 emmc、dm驱动调试、printenv/setenv/saveenv环境变量、bootm/booti启动内核。

产品发布后很多板子会关掉命令行,直接自动 boot

开发阶段全靠它调试 DDR、flash、网络。

4、附加能力

  • 环境变量存储:保存 bootargs、启动地址、mac 地址等,存在 flash;
  • 支持升级:固件升级、内核升级、rootfs 升级;
  • 支持脚本:autoboot 脚本;
  • 支持安全启动(配合 ATF、BL31,签名校验镜像);
  • 支持多种 OS 引导:Linux 是主力,也可以引导 VxWorks、QNX、RTOS 等。

U-Boot 不做的事情

  • 不跑业务应用;
  • 没有完整进程调度、文件系统权限、内存管理(和 Linux 内核完全两码事);
  • 不管理上层 APP;
  • ARMv8 平台下,一般不处理 EL3 安全异常,EL3 交给 ATF BL31。

三、U-Boot发展史

U-Boot 版本规则:从很早开始改成 年份。月份 的版本号,例如 2021.01、2021.04、2021.07、2021.10,每年 4 个主线版本(1/4/7/10 月发布)。

1、2000:

U-Boot 诞生,合并 PPCBoot+ARMBoot;初期主打 PowerPC,ARM 支持逐步完善。

2、2000~2008:

快速扩张架构支持:MIPS、x86、Blackfin 等;版本号 0.x → 1.x。

  • u-boot-1.1.4:里程碑版本,稳定,大量工业老设备长期基于这个版本改。

3、2008 左右:

切换到 year.month 版本命名体系,放弃 1.x、2.x 编号。

4、2010 前后:

DM 驱动模型(Driver Model)开始提出、逐步合入主线

  • 老 U-Boot 没有 DM:每个板子硬编码操作寄存器,驱动高度板级耦合,移植噩梦;
  • DM 目标:像 Linux 设备树驱动一样,驱动和板级解耦,用 DTS 描述硬件;
  • DM 是渐进合入,很长一段时间新旧驱动并存。

5、2014 之后:

ARM64(AArch64)主线支持成熟;SPL 架构成熟普及。 随着国产 SoC 兴起,SPL 变成标配:SPL 负责 DDR 初始化。

6、2021 系列

工业 / 安防 / AI SoC 最热门经典分支

① DM 驱动模型已经稳定成熟;CONFIG_DM_LINKER_LIST广泛使用;

② ARM64 支持完善、LPDDR4X、RGMII GMAC、eMMC、SPI NAND 支持很好;

③ 缺点:部分新特性(一些新的 DTS 绑定、新的安全框架、现代异步 probe)还没有;

④ 大量国产 SDK都基于 2021 做二次定制,原因:稳定、bug 少、社区资料多,又不会太新带来兼容性风险。

7、2022 ~ 现在主线(2022.01 → 2026.07)

DM 持续增强、异步 probe、OF_LIVE、更多安全启动、RISC-V 完善、新 DDR PHY 接口、更多现代总线;

但是新版本改动大,厂商 SDK 不愿意随便升级,怕引入回归 bug。

四、U-Boot 的优缺点总结

1、优点

  • 跨架构:ARM32/ARM64/PowerPC/MIPS/RISC-V;
  • 丰富命令行,开发调试无敌;
  • 介质支持极广:SD/eMMC/NAND/SPI NOR/TFTP/USB;
  • DM+DTS,现代驱动模型,移植比老版本方便;
  • 社区巨大,问题、资料、样例极多;
  • SPL 架构,解决 DDR 必须在 DDR 可用之前初始化的经典难题。

2、缺点

  • GPLv2 协议,产品商用有合规负担;
  • 历史代码多,很多老旧兼容逻辑,读源码门槛高;
  • 早期 SPL 内存极小,写代码要非常小心;
  • 厂商 fork 版本和主线差异大,主线补丁经常不能直接合入 SDK;
  • 不是为高性能业务设计,只是引导固件。
相关推荐
嵌入式分享6 小时前
驱动之路#43:一文理清 I2C 子系统架构
嵌入式
HRTOS7 小时前
8051 单片机 RTOS 开发的难点在哪里?从任务切换、中断管理到资源控制
单片机·51单片机·嵌入式·8051·hrtos
Y Shy18 小时前
2026.10 在受限的嵌入式机器人设备中使用LLM Agent
机器人·llm·嵌入式·agent
用户766166003111 天前
先中转、后打洞:libnpf 的 NAT 穿透与对称型 NAT 实战
嵌入式
优信电子1 天前
HC05蓝牙模块主机与从机进行连接通信
单片机·物联网·嵌入式
K成长日志1 天前
BLE Host层L2CAP -- 配置参数选项
物联网·网络协议·嵌入式·蓝牙·iot·ble·bluetooth
en.en..3 天前
第一篇:位域打包:看懂 I2C 地址左移的底层逻辑
stm32·嵌入式·位运算·i2c·底层驱动
youcans_3 天前
【嵌入式软件AI编程】21. 整理通用提示词模板
stm32·单片机·嵌入式·ai编程
zbyyd3 天前
Linux驱动:UART串口通信、GT9147触摸屏与IIO-ADC驱动开发
linux·驱动开发·arm