news 2026/3/6 9:21:34

图解说明树莓派4b启动流程与U-Boot定制过程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
图解说明树莓派4b启动流程与U-Boot定制过程

深入树莓派4B启动机制:从上电到U-Boot的完整旅程

你有没有想过,当你按下电源键、插上SD卡,树莓派4B是如何“活”起来的?它不像PC那样有BIOS或UEFI界面可看,但背后其实藏着一套精密而灵活的多阶段启动系统。更关键的是——这套系统完全可以被我们掌控

本文不讲空话,带你一步步拆解树莓派4B从上电复位操作系统加载的全过程,并手把手教你如何用开源引导程序U-Boot取代默认闭源流程,实现真正的启动自由。


一、树莓派4B启动到底经历了什么?

很多人以为树莓派就是“插卡即用”,但实际上它的启动远比想象中复杂。整个过程像接力赛一样,每一棒都至关重要。

那么,第一棒是谁?

答案是:SoC内部的一段只读代码(ROM)

这颗Broadcom BCM2711芯片在出厂时就固化了一小段不可更改的启动代码,学名叫First Level Bootloader (FLB)。它不需要外部存储器支持,通电后立刻运行,任务非常明确:

  • 初始化基本时钟
  • 启动DDR控制器
  • 尝试从eMMC或SD卡读取下一阶段程序

这个阶段完全透明且安全——因为没人能改它。

✅ 安全基点:Stage 0 ROM是信任根(Root of Trust),确保每次启动都有一个可靠的起点。

第二棒:谁来接手DRAM控制权?

过去,FLB会去加载一个叫bootcode.bin的文件,但现在——这个步骤已经被淘汰了。

自2020年起,树莓派基金会将这部分功能整合进了EEPROM固件(pieeprom.bin)中。也就是说,你现在不需要手动放bootcode.bin到SD卡上了。

真正接棒的是:loader.binloader4.elf

它是第二阶段引导程序,由FLB直接加载进内存执行,主要干两件事:
1. 继续完善DRAM初始化;
2. 根据配置决定下一步加载哪个程序——比如 U-Boot、start.elf 或其他自定义镜像。

📌 注意:所有这些引导文件必须放在FAT格式分区的根目录下,否则无法识别!

第三棒:可编程的“大脑”——SPI EEPROM

这是树莓派4B最聪明的设计之一:它内置了一个Winbond W25Q32JV SPI EEPROM,里面存着pieeprom.bin固件。

别小看这块小小的闪存,它掌管着整个系统的“启动策略”:

  • USB是否优先于SD卡?
  • 是否允许网络启动(PXE)?
  • HDMI输出要不要提前初始化?
  • 电源管理参数怎么设?

而且!你可以通过Linux系统随时更新它,实现动态调整启动行为

# 查看当前EEPROM版本 vcgencmd bootloader_version # 更新为支持USB启动的版本 sudo rpi-eeprom-update -d -f ./usbboot/pieeprom.bin

这意味着你可以让树莓派完全不用SD卡,直接从U盘或者网络启动。


二、为什么要引入U-Boot?

默认情况下,树莓派使用的是闭源组合:start.elf + config.txt来加载内核。虽然够用,但太“黑盒”了。

如果你想要:

  • 网络启动(TFTP/PXE)
  • 多系统选择菜单
  • 远程固件升级
  • 启动前做签名验证
  • 实时调试硬件状态

那你就得换上U-Boot—— 开源世界里最强大的嵌入式引导程序。

U-Boot 到底强在哪?

功能默认方案(start.elf)U-Boot
控制粒度文本配置有限命令行+脚本精细控制
启动源选择固定顺序可编程动态切换
网络能力几乎无支持DHCP/TFTP/NFS
安全性无验证机制可集成Secure Boot
调试支持几乎没有串口交互Shell

一句话总结:U-Boot 把启动变成了可编程的操作系统前置层


三、实战:编译并部署你的第一个U-Boot

现在我们动手实践,让你的树莓派4B跑起开源引导程序。

步骤1:获取并编译U-Boot

git clone https://source.codeaurora.org/external/u-boot.git cd u-boot make CROSS_COMPILE=aarch64-linux-gnu- rpi_4_defconfig make CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc)

完成后你会得到一个关键文件:u-boot.bin

⚠️ 编译环境要求:
- 已安装aarch64-linux-gnu-gcc
- 推荐在Ubuntu/Debian环境下操作

步骤2:准备SD卡结构

插入一张已格式化的SD卡(第一个分区为FAT32),放入以下文件:

/mnt/sdcard/ ├── u-boot.bin ├── boot.scr ← 启动脚本(稍后生成) ├── Image ← 内核镜像 ├── bcm2711-rpi-4-b.dtb ← 设备树 └── config.txt ← GPU相关配置(仍需保留)

注意:config.txt还不能删!因为它控制GPU内存划分等底层设置。例如加上这句:

gpu_mem=64

防止GPU占用过多内存导致U-Boot崩溃。


步骤3:编写启动脚本(boot.cmd)

创建一个文本文件boot.cmd

setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait earlyprintk load mmc 0:1 ${kernel_addr_r} Image load mmc 0:1 ${fdt_addr_r} bcm2711-rpi-4-b.dtb fdt addr ${fdt_addr_r} booti ${kernel_addr_r} - ${fdt_addr_r}

解释一下这段脚本做了什么:

  • 设置串口和根文件系统参数;
  • 从SD卡第1个分区(FAT)加载内核和设备树到内存;
  • 使用fdt addr告诉U-Boot设备树位置;
  • 最后用booti命令跳转到AArch64内核入口。

然后把它编译成二进制格式:

mkimage -A arm64 -O linux -T script -C none -n "rpi_boot" -d boot.cmd boot.scr

把生成的boot.scr拷贝到SD卡根目录。


步骤4:配置EEPROM启用U-Boot加载

你需要确保pieeprom.bin支持直接加载u-boot.bin。检查当前版本:

vcgencmd bootloader_config

查看是否有如下配置:

BOOT_ORDER=0xf14

其中0x4表示“尝试加载u-boot.bin”。如果不是,请更新为支持U-Boot的固件包。

也可以强制指定启动顺序(例如先USB,再SD卡):

BOOT_ORDER=0x14 # 先SD卡,再尝试U-Boot

更新后重启即可生效。


四、高级玩法:U-Boot还能怎么玩?

一旦你掌握了U-Boot,就打开了无数可能性的大门。

场景1:批量部署无SD卡系统(网络启动)

设想你有一百台树莓派分布在工厂各处。你还想挨个插卡吗?

用 U-Boot + TFTP + NFS 就能实现零本地存储部署:

=> dhcp => tftp ${kernel_addr_r} Image => tftp ${fdt_addr_r} dtb/bcm2711-rpi-4-b.dtb => setenv bootargs console=ttyS0,115200 root=/dev/nfs nfsroot=192.168.1.100:/export/rootfs ip=dhcp => booti ${kernel_addr_r} - ${fdt_addr_r}

所有设备开机自动联网下载内核和根文件系统,集中维护,极致高效。


场景2:多系统启动菜单

开发测试时经常要切系统?可以写个选择菜单:

echo "选择启动模式:" echo "1. Raspberry Pi OS" echo "2. Buildroot" echo "3. 实时Linux" setenv input '' while test "${input}" = ""; do sleep 1 if test "${keyhit}" = "1"; then setenv bootcmd 'run pi_os_boot' elif test "${keyhit}" = "2"; then setenv bootcmd 'run buildroot_boot' fi done

配合按键输入,在几秒内完成系统切换。


场景3:远程固件升级(救砖神器)

现场设备出问题了?不用拆机!

通过串口或SSH进入U-Boot命令行,使用Ymodem/TFTP协议上传新固件:

=> tftp 0x2000000 new-u-boot.bin => sf probe; sf erase 0 +$filesize; sf write 0x2000000 0 $filesize

瞬间完成远程刷写,连物理接触都不需要。


五、避坑指南:那些年踩过的雷

别以为编译完就能跑,实际部署中有很多细节容易翻车。

❌ 坑1:串口没输出?波特率对了吗?

树莓派4B默认串口是 GPIO14/15(UART0),波特率为115200,8N1。

务必使用USB-TTL模块连接,并确认跳线正确。很多模块默认是3.3V电平,千万别接错!

❌ 坑2:U-Boot崩溃?内存地址冲突!

U-Boot默认加载地址是0x100000,但内核通常期望在0x2000000开始。

如果地址重叠,后果就是花屏、死机、跳转失败。

建议统一规划内存布局:

区域地址
U-Boot0x00100000
Kernel0x02000000
DTB0x03000000
Initrd0x03200000

可在.config中通过CONFIG_SYS_TEXT_BASE修改U-Boot加载地址。

❌ 坑3:找不到boot.scr?分区格式错了!

必须使用FAT16/FAT32分区,且是第一个主分区。EXT4、NTFS都不行!

可以用fdisk检查:

sudo fdisk -l /dev/sdX

确认第一个分区类型是c(W95 FAT32 LBA)或b(FAT32)。


六、未来展望:不只是引导,更是可信计算的起点

今天的U-Boot只是一个开始。

结合Trusted Firmware-A (TF-A)OP-TEE,我们可以构建完整的 ARM TrustZone 安全启动链:

SoC ROM → TF-A → U-Boot → Linux (Normal World) └→ OP-TEE (Secure World)

每一步都进行签名验证,杜绝恶意固件注入。这对于工业控制、金融终端、车载系统等高安全性场景意义重大。

此外,随着U-Boot主线对树莓派平台的支持日益完善,未来有望原生支持:

  • PCIe外设引导
  • NVMe SSD启动
  • 更快的DMA传输
  • 图形化启动界面(splash screen)

结语:掌握启动,才算真正掌控设备

树莓派4B不只是教学玩具。当你能用U-Boot定制启动流程时,它就已经是一台生产级嵌入式设备了。

从闭源黑盒到全链路可控,从单机运行到网络集群,这一小步,可能是你迈向嵌入式系统深度开发的一大步。

如果你也正在尝试U-Boot移植,欢迎在评论区分享你的经验。遇到卡住的地方?贴出串口日志我们一起分析。

毕竟,每一个成功的启动背后,都是无数次失败的日志堆出来的。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/6 0:30:10

ESP32开发环境搭建与Home Assistant集成操作指南

从零开始:用ESP32打造你的第一套本地化智能家居系统 你有没有过这样的经历?半夜醒来发现客厅灯没关,想远程关掉却发现家里的智能插座依赖云端服务——而那个服务器偏偏正在“维护”。又或者,买了一堆五花八门的传感器,…

作者头像 李华
网站建设 2026/3/1 13:07:56

14、深入了解 SQL Server 的 WMI 事件提供者及事件监控

深入了解 SQL Server 的 WMI 事件提供者及事件监控 在 SQL Server 管理中,对事件的有效监控是保障系统稳定运行的关键。WMI(Windows Management Instrumentation)提供者为服务器事件监控提供了强大的功能。下面将详细介绍 WMI 提供者的相关知识,以及如何使用它来监控 SQL …

作者头像 李华
网站建设 2026/3/5 5:50:18

17、SQL Server 管理:PowerShell 与 SMO 的应用

SQL Server 管理:PowerShell 与 SMO 的应用 1. 基于策略的管理 在同一 SQL Server 实例上,有一个名为 admin2 的数据库被故意损坏。若要针对该数据库评估“Database Page Status”策略,可运行以下命令: $db=Get-Item SQLSERVER:\SQL\PowerPC\default\Databases\admin…

作者头像 李华
网站建设 2026/3/6 0:29:20

19、SQL Server 和 PowerShell 编码标准构建指南

SQL Server 和 PowerShell 编码标准构建指南 1. 存储过程标准 当开发者准备创建存储过程时,数据库管理员(DBA)应审查代码,确保其遵循既定标准,涵盖格式规范、合理使用和良好设计。若发现问题,DBA 需告知开发者并说明修改原因,以便在生产环境出现问题前审查和优化代码。…

作者头像 李华
网站建设 2026/3/2 14:16:47

终极指南:macOS免费NTFS读写工具快速上手教程

终极指南:macOS免费NTFS读写工具快速上手教程 【免费下载链接】Free-NTFS-for-Mac Nigate,一款支持苹果芯片的Free NTFS for Mac小工具软件。NTFS R/W for macOS. Support Intel/Apple Silicon now. 项目地址: https://gitcode.com/gh_mirrors/fr/Free…

作者头像 李华
网站建设 2026/2/27 20:23:43

30、Windows PowerShell数据库脚本生成与常用Cmdlets详解

Windows PowerShell数据库脚本生成与常用Cmdlets详解 1. 数据库脚本生成与比较 可以安排Windows PowerShell脚本每天夜间运行。之后,将某一天某个脚本生成的文件与另一天同一脚本生成的文件进行比较,以此查看是否有内容发生变化。 2. 常用Cmdlets及操作说明 2.1 获取Cmdl…

作者头像 李华