U-Boot 专题
U-Boot 是最流行的开源引导程序,支持几乎所有路由器架构。
简介
U-Boot (Das U-Boot) 是德信开源的嵌入式引导程序。
官方网站:https://www.denx.de/wiki/U-Boot/
主要特点:
- 完全开源
- 支持多种 CPU 架构(MIPS/ARM/PowerPC/x86)
- 丰富的启动命令
- 支持网络启动(TFTP/NFS)
- 强大的环境变量系统
- 可从 Flash、网络、串口加载
架构支持
MIPS
- 常见于 MediaTek MT7620/MT7621
- TP-Link、小米、华为部分机型
- 典型地址:0x9f000000(Flash)
ARM
- 博通 BCM47xx/BCM53xx 系列
- 高通 IPQ 系列
- 小米/Netgear/华硕部分机型
x86
- 软路由
- Intel/AMD 平台
启动流程
上电初始化
U-Boot 1.1.4 (Dec 6 2021 - 11:13:09) CPU: MediaTek MT7621AT RAM: 256MB DDR3 Flash: W25Q128JV
自动引导
- 读取环境变量 bootcmd
- 执行启动命令
- 从 Flash/网络加载内核
- 传递参数给内核
中断自动引导
在启动时按任意键可进入命令行:
Hit any key to stop autoboot: 0
常用命令
环境变量
# 查看所有环境变量 printenv # 查看特定变量 printenv ipaddr printenv bootcmd # 设置变量 setenv ipaddr 192.168.1.1 setenv serverip 192.168.1.100 # 保存到 Flash saveenv # 恢复默认 env default -a saveenv
存储操作
# 读取 Flash 信息 sf probe # 读取内存 md.l 0x81000000 10 # 读取 10 个 32-bit 字 md.b 0x81000000 100 # 读取 100 字节 # 写入内存 mw.l 0x81000000 0x12345678 1
TFTP 启动
# 设置环境变量 setenv ipaddr 192.168.1.1 # 路由器 IP setenv serverip 192.168.1.100 # TFTP 服务器 IP # 从 TFTP 加载固件到内存 tftpboot 0x81000000 openwrt.bin # 或简写 tftp 0x81000000 openwrt.bin # 启动固件 bootm 0x81000000
Flash 操作
# 擦除 Flash 分区 # 语法:erase <start> +<length> erase 0x9f020000 +0x300000 # 复制数据 # 语法:cp.b <src> <dst> <length> cp.b 0x81000000 0x9f020000 0x300000 # 从内存写入 Flash sf write 0x81000000 0x9f020000 0x300000
启动命令
# 直接启动指定地址 bootm 0x9f020000 # 从网络启动 bootp 0x81000000 firmware.bin bootm 0x81000000 # 从 SD 卡启动(部分设备) load mmc 0:1 0x81000000 uImage bootm 0x81000000
其他命令
# 复位 reset # 打印版本 version # 帮助 help # 列出设备 printenv bootdev
环境变量详解
bootcmd
定义自动引导命令:
bootcmd=bootm 0x9f020000 # 或网络启动 bootcmd=tftp 0x81000000 openwrt.bin; bootm 0x81000000
bootargs
传递给内核的参数:
bootargs=console=ttyS0,115200 root=/dev/mtdblock2 rootfstype=squashfs mtdparts=spi0.0:256k(u-boot),64k(u-boot-env),3000k(kernel),-(rootfs)
mtdparts
Flash 分区定义:
mtdparts=spi0.0:256k(u-boot),64k(config),3000k(kernel),-(rootfs)
TFTP 服务器配置
Windows
使用 TFTPD64:
- 设置 TFTP 根目录
- 确认防火墙允许
- 确保使用有线连接
Linux
sudo apt install tftpd-hpa sudo systemctl start tftpd-hpa # 将固件放入 /srv/tftp/
macOS
sudo launchctl load -w /System/Library/LaunchDaemons/tftp.plist # 将固件放入 /private/tftpboot/
常见问题
bootcmd 为空
# 恢复默认 setenv bootcmd bootm 0x9f020000 saveenv reset
TFTP 连接失败
- 确认电脑和路由器 IP 在同一网段
- 检查防火墙
- 确认 TFTP 服务器运行中
- 使用 ping 测试连通性
Flash 写入失败
- 确认地址正确
- 可能 Flash 损坏
- 尝试先擦除再写入
环境变量丢失
- 环境变量存储在 Flash 特定分区
- 使用 saveenv 保存
- 恢复方法:setenv default 并 saveenv
Breed 与 U-Boot 对比
| 特性 | Breed | U-Boot |
| —— | ——– | ——– |
| 开源 | ❌ | ✅ |
| Web 界面 | ✅ | ❌ |
| 多固件备份 | ✅ | ❌ |
| 命令复杂度 | 简单 | 复杂 |
| 设备支持 | 有限 | 广泛 |