U-Boot 基础指令精讲——环境变量、设备查询常用命令
本文由黒漂技术佬原创,首发于 CSDN,转载请注明出处。
一、引言
前两篇文章我们了解了 U-Boot 的工作原理,也成功编译出了属于自己板子的u-boot.bin。当 U-Boot 启动后,串口终端上会显示几秒倒计时,按任意键打断自动启动,你会看到这个界面:
U-Boot 2024.01 (Jan 10 2026 - 14:30:00 +0800) CPU : AM335X-GP rev 2.1 Model: TI AM335x BeagleBone Black DRAM: 512 MiB MMC: OMAP SD/MMC: 0 Hit any key to stop autoboot: 3 ... =>那个=>就是 U-Boot 的命令提示符,你面对的其实是一个精简版的 Shell。今天我们就来玩透 U-Boot 中最基础的那些命令——别小看它们,掌握这些命令是后续配置启动参数、排查启动问题的基本功。
二、命令行操作基础
2.1 U-Boot Shell 的特点
和 Linux 的 Bash 不同,U-Boot 的命令行非常简单:
- 支持命令历史(按上下箭头翻历史,部分版本支持)。
- 支持 Tab 补全。
- 支持简单变量展开(
$variable)。 - 不支持管道、重定向等高级 Shell 特性。
- 命令区分大小写。
2.2 万能起点:help命令
任何一个操作系统或 Shell 中,help都是你的救命稻草,U-Boot 也不例外。
=> help ? - alias for 'help' askenv - get environment variable stdin and store base - print or set address offset bdinfo - print Board Info structure boot - boot default, i.e., run 'bootcmd' bootd - boot default, i.e., run 'bootcmd' bootm - boot application image from memory bootp - boot image via network using BOOTP/TFTP protocol bootz - boot Linux zImage image from memory cmp - memory compare cp - memory copy crc32 - checksum calculation dhcp - boot image via network using DHCP/TFTP protocol echo - echo args to console editenv - edit environment variable env - environment handling commands ext2load- load binary file from a Ext2 filesystem ext4load- load binary file from a Ext4 filesystem fatload - load binary file from a dos filesystem fatls - list files in a directory (default /) fdt - flattened device tree utility commands go - start application at address 'addr' help - print command description/usage i2c - I2C sub-system load - load binary file from a filesystem loadb - load binary file over serial line (kermit mode) loadx - load binary file over serial line (xmodem mode) loady - load binary file over serial line (ymodem mode) ls - list files in a directory (default /) md - memory display mm - memory modify (auto-incrementing) mmc - MMC sub system mmcinfo - display MMC info mtest - simple RAM test mw - memory write (fill) nfs - boot image via network using NFS protocol ping - send ICMP ECHO_REQUEST to network host printenv- print environment variables reset - Perform RESET of the CPU run - run commands in an environment variable saveenv - save environment variables to persistent storage setenv - set environment variables tftp - boot image via network using TFTP protocol tftpboot- boot image via network using TFTP protocol version - print monitor, compiler and linker version密密麻麻上百条命令,新人看到这里容易懵。别慌,我们把这些命令分个类,按需学习——日常调板子真正高频使用的也就二十来个。
2.3 U-Boot 命令分类
| 类别 | 典型命令 | 使用频率 |
|---|---|---|
| 信息查询 | help,bdinfo,version,printenv | 极高 |
| 环境变量 | setenv,saveenv,editenv | 极高 |
| 内存操作 | md,mw,cp,cmp | 中 |
| 存储设备 | mmc,fatls,fatload,ext4load | 极高 |
| 网络操作 | ping,tftp,dhcp,nfs | 中 |
| 启动命令 | boot,bootm,bootz,run bootcmd | 极高 |
| 调试命令 | mtest,i2c,fdt | 低 |
下面我们重点展开几个最常用的信息查询类命令。
三、信息查询类命令详解
3.1bdinfo——开发板身份证
bdinfo(Board Info)是最常用的板卡信息查询命令,它打印当前板卡的关键硬件参数。
=> bdinfo arch_number = 0x00000EE1 boot_params = 0x80000100 DRAM bank = 0x00000000 -> start = 0x80000000 -> size = 0x20000000 baudrate = 115200 bps TLB addr = 0x9FFF0000 relocaddr = 0x9FF54000 reloc off = 0x18754000 irq_sp = 0x9DF4DAE0 sp start = 0x9DF4DAE0 Early malloc usage: 46c / 2000| 字段 | 含义 |
|---|---|
arch_number | 机器类型 ID(MACH_TYPE),用于内核识别硬件平台 |
boot_params | 启动参数存放地址 |
DRAM bank | DDR 内存的起始地址和大小 |
baudrate | 当前串口波特率 |
relocaddr | U-Boot 自身重定位后的地址 |
拿到板子第一步就应该敲bdinfo,确认内存容量是否对得上——别等内核跑到一半 panic 了才发现 DDR 初始化不对。
3.2version——你是谁?
=> version U-Boot 2024.01 (Jan 10 2026 - 14:30:00 +0800) arm-linux-gnueabihf-gcc (GNU Toolchain) 13.2.1 GNU ld (GNU Binutils) 2.41这个命令告诉你当前 U-Boot 的版本号、编译时间和使用的工具链。排查问题时,版本信息至关重要——某些 bug 只在特定版本存在。
3.3printenv——看看启动"配方"
=> printenv arch=arm baudrate=115200 board=am335x board_name=A335BNLT bootcmd=run findfdt; run mmcboot; setenv mmcdev 1; setenv bootpart 1:2; ... bootdelay=2 bootdir=/boot bootfile=zImage console=ttyO0,115200n8 cpu=armv7 ethaddr=68:c9:0b:4d:12:a8 fdtfile=am335x-boneblack.dtb loadaddr=0x82000000 ...printenv是 U-Boot 中最常用的命令之一(没有之一)。它打印所有环境变量及其值。环境变量是 U-Boot 的"配方书",决定了启动方式、内核路径、网络配置等一切行为。
如果只想看某一个变量,可以加参数:
=> printenv bootcmd bootcmd=run findfdt; run mmcboot; setenv mmcdev 1; setenv bootpart 1:2; ...3.4echo——最简单的输出
=> echo Hello U-Boot! Hello U-Boot! => echo $board_name A335BNLT => echo Load address is $loadaddr Load address is 0x82000000echo支持$variable变量展开,在调试脚本(bootcmd)时经常用到。
四、存储设备查询命令
4.1mmc info——SD 卡/eMMC 信息
=> mmc info Device: OMAP SD/MMC Manufacturer ID: 3 OEM: 5344 Name: SL08G Bus Speed: 48000000 Mode: SD High Speed (50MHz) Rd Block Len: 512 SD version 3.0 High Capacity: Yes Capacity: 7.4 GiB Bus Width: 4-bit4.2mmc list——列出所有 MMC 设备
=> mmc list OMAP SD/MMC: 0 OMAP SD/MMC: 14.3mmc dev——切换当前 MMC 设备
=> mmc dev 0 switch to partitions #0, OK mmc0 is current device4.4mmc part——查看分区表
=> mmc part Partition Map for MMC device 0 -- Partition Type: DOS Part Start Sector Num Sectors UUID Type 1 2048 131072 9e39f1f1-01 0c Boot 2 133120 15183872 9e39f1f1-02 834.5fatls/ext4ls——浏览文件系统
=> fatls mmc 0:1 4173976 zImage 57763 am335x-boneblack.dtb 5386744 uInitrd 4 file(s), 0 dir(s)五、内存查看命令
5.1md——Memory Display
=> md 0x80000000 10 80000000: 00000000 00000000 00000000 00000000 ................ 80000010: 00000000 00000000 00000000 00000000 ................ 80000020: 00000000 00000000 00000000 00000000 ................- 第一个参数是起始地址。
- 第二个参数是显示的字数(每行 4 个 32 位字)。
md.b按字节显示,md.w按半字显示,md.l按长字(32位)显示。
5.2mw——Memory Write
# 向地址 0x80000100 写入值 0x12345678=>mw.l 0x80000100 0x12345678=>md.l 0x80000100180000100:123456785.3mm——交互式内存修改
=>mm 0x8000010080000100:12345678? 0xAABBCCDD80000104: 00000000 ?.输入.退出交互模式。注意mm每次自动递增地址。
六、网络测试命令
在正式开始 TFTP/NFS 启动之前,先用ping确认网络是否通:
=> setenv ipaddr 192.168.1.100 => setenv serverip 192.168.1.200 => ping 192.168.1.200 Using cpsw device host 192.168.1.200 is alive看到is alive就说明 PHY 初始化成功、MAC 地址正确、路由可达。如果 ping 不通,先检查网线、IP 配置、以及 PHY 驱动是否编译进 U-Boot。
七、总结
本文梳理了 U-Boot 中最常用的基础命令,按信息查询、存储设备、内存操作、网络测试四个维度分类讲解:
help/bdinfo/version/printenv是"侦探四件套",接了板子先敲一遍。- MMC 系列命令(
mmc info/mmc part/fatls)帮你探索存储介质。 md/mw用于裸内存读写,调试利器。ping是网络启动的前提条件。
这些命令看似零散,但组合起来就是一套完整的调试工具箱。下一篇文章,我们聚焦setenv和saveenv,深度玩转 U-Boot 最核心的特性——环境变量系统。