U-Boot命令手册

本文测试环境为基于QEMU和U-Boot搭建嵌入式Linux模拟仿真环境搭建的模拟环境。

一、信息查询命令

(一)主板信息【bdinfo】

查看主板主要配置,如 DRAM 的起始地址和大小、启动参数保存起始地址、波特率、sp(堆栈指

针)起始地址等。

bash 复制代码
=> bdinfo
boot_params = 0x60002000
DRAM bank   = 0x00000000
-> start    = 0x60000000
-> size     = 0x20000000
DRAM bank   = 0x00000001
-> start    = 0x80000000
-> size     = 0x00000004
flashstart  = 0x40000000
flashsize   = 0x08000000
flashoffset = 0x00000000
baudrate    = 38400 bps
relocaddr   = 0x7ff5d000
reloc off   = 0x1f75d000
Build       = 32-bit
current eth = ethernet@3,02000000
ethaddr     = 52:54:00:12:34:56
IP addr     = <NULL>
fdt_blob    = 0x7ffe0ac0
lmb_dump_all:
 memory.count = 0x1
 memory[0]	[0x60000000-0x80000003], 0x20000004 bytes, flags: none
 reserved.count = 0x2
 reserved[0]	[0x7eb19000-0x7eb1bfff], 0x3000 bytes, flags: no-notify, no-overwrite
 reserved[1]	[0x7eb1ceb0-0x80000003], 0x14e3154 bytes, flags: no-overwrite
devicetree  = embed
serial addr = 0x10009000
 width      = 0x00000004
 shift      = 0x00000002
 offset     = 0x00000000
 clock      = 0x016e3600
arch_number = 0x000008e0
TLB addr    = 0x7fff0000
irq_sp      = 0x7fb1cec0
sp start    = 0x7fb1ceb0
Early malloc usage: 574 / 800

(二)环境变量printenv

输出环境变量信息

bash 复制代码
=> print
arch=arm
baudrate=38400
board=vexpress
board_name=vexpress
boot_a_script=load ${devtype} ${devnum}:${distro_bootpart} ${scriptaddr} ${prefix}${script}; source ${scriptaddr}
boot_efi_binary=load ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} efi/boot/bootarm.efi; if fdt addr -q ${fdt_addr_r}; then bootefi ${kernel_addr_r} ${fdt_addr_r};else bootefi ${kernel_addr_r} ${fdtcontroladdr};fi
boot_efi_bootmgr=if fdt addr -q ${fdt_addr_r}; then bootefi bootmgr ${fdt_addr_r};else bootefi bootmgr;fi
boot_extlinux=sysboot ${devtype} ${devnum}:${distro_bootpart} any ${scriptaddr} ${prefix}${boot_syslinux_conf}
boot_prefixes=/ /boot/
boot_script_dhcp=boot.scr.uimg
boot_scripts=boot.scr.uimg boot.scr
boot_syslinux_conf=extlinux/extlinux.conf
boot_targets=mmc1 mmc0 pxe dhcp 
bootargs=console=tty0 console=ttyAMA0,38400n8
bootcmd=run distro_bootcmd; run bootflash
bootcmd_dhcp=devtype=dhcp; if dhcp ${scriptaddr} ${boot_script_dhcp}; then source ${scriptaddr}; fi;setenv efi_fdtfile ${fdtfile}; if test -z "${fdtfile}" -a -n "${soc}"; then setenv efi_fdtfile ${soc}-${board}${boardver}.dtb; fi; setenv efi_old_vci ${bootp_vci};setenv efi_old_arch ${bootp_arch};setenv bootp_vci PXEClient:Arch:00010:UNDI:003000;setenv bootp_arch 0xa;if dhcp ${kernel_addr_r}; then tftpboot ${fdt_addr_r} dtb/${efi_fdtfile};if fdt addr -q ${fdt_addr_r}; then bootefi ${kernel_addr_r} ${fdt_addr_r}; else bootefi ${kernel_addr_r} ${fdtcontroladdr};fi;fi;setenv bootp_vci ${efi_old_vci};setenv bootp_arch ${efi_old_arch};setenv efi_fdtfile;setenv efi_old_arch;setenv efi_old_vci;
bootcmd_mmc0=devnum=0; run mmc_boot
bootcmd_mmc1=devnum=1; run mmc_boot
bootcmd_pxe=dhcp; if pxe get; then pxe boot; fi
bootdelay=2
bootflash=run flashargs; cp ${ramdisk_addr} ${ramdisk_addr_r} ${maxramdisk}; bootm ${kernel_addr} ${ramdisk_addr_r}
console=ttyAMA0,38400n8
cpu=armv7
distro_bootcmd=for target in ${boot_targets}; do run bootcmd_${target}; done
dram=1024M
efi_dtb_prefixes=/ /dtb/ /dtb/current/
ethaddr=52:54:00:12:34:56
fdt_addr_r=0x60000000
fdtcontroladdr=7ffe0ac0
fdtfile=vexpress-v2p-ca9.dtb
flashargs=setenv bootargs root=${root} console=${console} mem=${dram} mtdparts=${mtd} mmci.fmax=190000 devtmpfs.mount=0  vmalloc=256M
kernel_addr_r=0x60100000
load_efi_dtb=load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${prefix}${efi_fdtfile}
loadaddr=0x60100000
mmc_boot=if mmc dev ${devnum}; then devtype=mmc; run scan_dev_for_boot_part; fi
mtd=armflash:1M@0x800000(uboot),7M@0x1000000(kernel),24M@0x2000000(initrd)
root=/dev/sda1 rw
scan_dev_for_boot=echo Scanning ${devtype} ${devnum}:${distro_bootpart}...; for prefix in ${boot_prefixes}; do run scan_dev_for_extlinux; run scan_dev_for_scripts; done;run scan_dev_for_efi;
scan_dev_for_boot_part=part list ${devtype} ${devnum} -bootable devplist; env exists devplist || setenv devplist 1; for distro_bootpart in ${devplist}; do if fstype ${devtype} ${devnum}:${distro_bootpart} bootfstype; then part uuid ${devtype} ${devnum}:${distro_bootpart} distro_bootpart_uuid ; run scan_dev_for_boot; fi; done; setenv devplist
scan_dev_for_efi=setenv efi_fdtfile ${fdtfile}; if test -z "${fdtfile}" -a -n "${soc}"; then setenv efi_fdtfile ${soc}-${board}${boardver}.dtb; fi; for prefix in ${efi_dtb_prefixes}; do if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}${efi_fdtfile}; then run load_efi_dtb; fi;done;run boot_efi_bootmgr;if test -e ${devtype} ${devnum}:${distro_bootpart} efi/boot/bootarm.efi; then echo Found EFI removable media binary efi/boot/bootarm.efi; run boot_efi_binary; echo EFI LOAD FAILED: continuing...; fi; setenv efi_fdtfile
scan_dev_for_extlinux=if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}${boot_syslinux_conf}; then echo Found ${prefix}${boot_syslinux_conf}; run boot_extlinux; echo EXTLINUX FAILED: continuing...; fi
scan_dev_for_scripts=for script in ${boot_scripts}; do if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}${script}; then echo Found U-Boot script ${prefix}${script}; run boot_a_script; echo SCRIPT FAILED: continuing...; fi; done
stderr=uart@9000
stdin=uart@9000
stdout=uart@9000
ubifs_boot=if ubi part ${bootubipart} ${bootubioff} && ubifsmount ubi0:${bootubivol}; then devtype=ubi; devnum=ubi0; bootfstype=ubifs; distro_bootpart=${bootubivol}; run scan_dev_for_boot; ubifsumount; fi
vendor=armltd

Environment size: 4311/262140 bytes

(三)版本信息version

查看uboot的版本号

bash 复制代码
=> version
U-Boot 2026.04-rc1-00063-geed514b11d04-dirty (Jan 31 2026 - 15:24:23 +0000)

arm-linux-gnueabihf-gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
GNU ld (GNU Binutils for Ubuntu) 2.38

二、环境变量操作指令

(一)修改环境变量setenv

  • 修改或新建:setenv [环境变量名] [环境变量值]
  • 删除:setenv [环境变量名]
bash 复制代码
=> set bootargs 'kernel=/root/zImage console=ttyAM0,115200 init=linuxrc'

(二)保存环境变量saveenv

bash 复制代码
=> saveenv
Saving Environment to Flash... . done
Un-Protected 1 sectors
Erasing Flash...
. done
Erased 1 sectors
Writing to Flash... done
. done
Protected 1 sectors
OK

三、内存操作指令

(一)查看内存数据md

md 命令用于显示内存值,格式如下:

md [.b, .w, .l] address [# of objects]

.b .w .l\]对应byte,word和long分别以1个字节、2个字节、4个字节来显示内存值 address 就是要查看的内存起始地址 \[# of objects\]表示要查看的数据长度 ```bash => md 80000000 14 80000000: 00000000 00000000 00000000 00000000 ................ 80000010: 00000000 00000000 00000000 00000000 ................ 80000020: 00000000 00000000 00000000 00000000 ................ 80000030: 00000000 00000000 00000000 00000000 ................ 80000040: 00000000 00000000 00000000 00000000 ................ => md.b 80000000 14 80000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 80000010: 00 00 00 00 .... => md.w 80000000 14 80000000: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 80000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 80000020: 0000 0000 0000 0000 ........ => md.l 80000000 14 80000000: 00000000 00000000 00000000 00000000 ................ 80000010: 00000000 00000000 00000000 00000000 ................ 80000020: 00000000 00000000 00000000 00000000 ................ 80000030: 00000000 00000000 00000000 00000000 ................ 80000040: 00000000 00000000 00000000 00000000 ................ ``` ### (二)修改内存指令 nm 命令用于修改指定地址的内存值,命令格式如下: nm \[.b, .w, .l\] address mm \[.b, .w, .l\] address ;//地址可递增 mw \[.b, .w, .l\] address value \[count\] ;//命令mw用于使用一个指定的数据填充一段内存。 ### (三)内存拷贝指令 cp是数据拷贝命令,用于将 DRAM中的数据从一段内存拷贝到另一段内存中,或者把Nor Flash中的数据拷贝到 DRAM中。 cp \[.b, .w, .l\] src_addr dst_addr count 可以用 .b、.w、.l来指定操作格式, source为源地址, target为目的地址, count为拷贝的长度。 ### (四)内存比较指令 cmp用于比较两段内存的数据是否相等。 cmp \[.b, .w, .l\] addr1 addr2 count 可用 .b、 .w和 .l来指定操作格式, addr1为第一段内存首地址, addr2为第二段内存首地址,count为要比较的长度。 ## 四、系统引导命令 uboot 的本质工作是引导操作系统(如 Linux),常用的跟系统引导有关的命令有:bootm、bootz 和 boot。引导命令的主要工作是将 Linux 镜像文件拷贝到 DRAM 中。如果使用到设备树的话也需要将设备树拷贝到 DRAM 中。 * 可以从SD卡中将 Linux 镜像和设备树文件加载到DRAM * 通过 nfs 或者 tftp 协议将 Linux 镜像文件和设备树文件下载到DRAM中。 拷贝完成后使用 bootm 命令来启动内核。 ### (一)bootm命令 bootm 命令用于启动在内存中的用 mkimage 工具处理过的内核镜像 bootm addr addr 是 image.ub 镜像在 DRAM 中的首地址 例:tftpboot 10000000 image.ub bootm 10000000 //我们将 image.ub 下载到 DRAM 的 0x10000000 地址处,然后使用命令 bootm 启动 注:这两步命令可以简化为一步命令,启动 uboot 后(默认已设置好 serverip 变 量),使用"run netboot"命令即可 ### (二)bootz命令 bootz 和 bootm 功能类似,只是 bootz 命令用于启动 zImage 镜像文件,zynq 使 用的不多,了解即可。bootz 命令格式如下: bootz \[addr \[initrd\[:size\]\] \[fdt\]

addr 是 Linux zImage 镜像文件在 DRAM 中的位置,

initrd 是initrd文件在DRAM中的地址,即INITRAM根文件系统的在内存中的 地址,如果不使用 initrd 的话使用'-'代替即可,

fdt 就是设备树文件在 DRAM 中的地址

tftpboot 00000000 zImage //将zImage下载到 DRAM 的 0x00000000 地址处, tftpboot 05000000 system.dtb //将设备树下载到DRAM中的 0x05000000 地址处

bootz 00000000 - 05000000 //启动

(三)boot命令

boot 命令也是用来启动Linux系统的,只是boot会读取环境变量bootcmd来启 动Linux系统,bootcmd 是一个很重要的环境变量。其名字分为"boot"和"cmd", 也就是"引导"和"命令",说明这个环境变量保存着引导命令,其实就是启动的命令 集合,具体的引导命令内容是可以修改的。比如我们要想使用 tftpboot 命令从网 络启动 Linux 那么就可以设置 bootcmd为"tftpboot 10000000 image.ub;bootm",然 后使用 saveenv 将 bootcmd 保存起来。然后直接输入 boot 命令即可从网络启动 Linux 系统,命令如下:

setenv bootcmd 'tftpboot 10000000 image.ub;bootm'

五、文件系统指令

(一)fatinfo 命令

fatinfo 命令用于查询指定 MMC 指定分区的文件系统信息,格式如下:

fatinfo <interface> [<dev[:part]>]

interface 表示接口,比如 mmc,dev 是查询的设备号,part 是要查询的分区

例: fatinfo mmc 0:1 //查询 SD 卡分区 1 的文件系统信息

(二)fatls命令

fatls <interface> [<dev[:part]>] [directory]

directory 是要查询的目录

例:fatls mmc 0:1 //查询 SD 卡分区 1 中的所有的目录和文件

(三)fstype 命令

fstype 用于查看 MMC 设备某个分区的文件系统格式,命令格式如下:

fstype <interface> <dev>:<part>

(四)fatload命令

fatload 命令用于将指定的文件读取到 DRAM 中,命令格式如下:

fatload <interface> [<dev[:part]> [<addr> [<filename> [bytes [pos]]]]]

interface 为接口,比如 mmc,dev 是设备号

part 是分区,addr 是保存在 DRAM 中的起始地址,

filename 是要读取的文件名字。bytes 表示读取多少字节的数据,如果 bytes 为 0 或者省略的话表示读取整个文件。

pos 是要读的文件相对于文件首地址的偏移,如果为 0 或者省略的话表示从文件 首地址开始读取

例:fatload mmc 0:1 00000000 BOOT.BIN//SD 卡分区 1 中的 BOOT.BIN 文件读 取到 DRAM 中的0X00000000 地址处

(五)fatwrite 命令

fatwirte 命令用于将 DRAM 中的数据写入到 MMC 设备中,命令格式如下:

fatwrite <interface> <dev[:part]> <addr> <filename> <bytes>

我们可以通过 fatwrite 命令在 uboot 中更新 linux 镜像文件和设备树

例:fatwrite mmc 0:1 00000000 image.ub 0x428400

uboot 有 ext2 和 ext4 这两种格式的文件系统的操作命令,常用的就四个命令,分别 为:

ext2load、ext2ls、ext4load、ext4ls 和 ext4write。

这些命令的含义和使用与 fatload、fatls和 fatwrit 一样

六、EMMC和SD卡操作命令

(一)mcc info命令

用于输出当前选中的 mmc info 设备的信息

(二)mmc rescan命令

用于扫描当前开发板上所有的 MMC 设备,包括 EMMC 和 SD 卡

(三)mmc list 命令

用于来查看当前开发板一共有几个 MMC 设备

(四)mmc dev 命令

mmc dev 命令用于切换当前 MMC 设备,命令格式如下:

mmc dev [dev] [part]

dev\]用来设置要切换的 MMC 设备号 \[part\]是分区号。如果不写分区号的话默认为分区0。 例:mmc dev 1 //切换到eMMC,0为SD卡,1为eMMC ### (五)[mmc part](https://zhida.zhihu.com/search?content_id=247212823&content_type=Article&match_order=1&q=mmc+part&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3NzAyOTkwMTUsInEiOiJtbWMgcGFydCIsInpoaWRhX3NvdXJjZSI6ImVudGl0eSIsImNvbnRlbnRfaWQiOjI0NzIxMjgyMywiY29udGVudF90eXBlIjoiQXJ0aWNsZSIsIm1hdGNoX29yZGVyIjoxLCJ6ZF90b2tlbiI6bnVsbH0.y1M2N09A5R8SOZO_9pBcD0OwriWV8G1F-ZjTTFiUZYw&zhida_source=entity "mmc part")命令 有时候 SD 卡或者 EMMC 会有多个分区,可以使用命令"mmc part"来查看其分区, 比如查看 SD 卡的分区情况,输入如下命令: mmc dev 0 //切换到 SD 卡 mmc part //查看 SD 卡分区 ### (六)[mmc read](https://zhida.zhihu.com/search?content_id=247212823&content_type=Article&match_order=1&q=mmc+read&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3NzAyOTkwMTUsInEiOiJtbWMgcmVhZCIsInpoaWRhX3NvdXJjZSI6ImVudGl0eSIsImNvbnRlbnRfaWQiOjI0NzIxMjgyMywiY29udGVudF90eXBlIjoiQXJ0aWNsZSIsIm1hdGNoX29yZGVyIjoxLCJ6ZF90b2tlbiI6bnVsbH0.ROzCzbvid6Db4Tp1cUGb0-NIs6JgsoXxIWPXTSLsRKA&zhida_source=entity "mmc read")命令 mmc read 命令用于读取 mmc 设备的数据,命令格式如下: mmc read addr blk# cnt addr 是数据读取到 DRAM 中的地址, blk 是要读取的块起始地址(十六进制),一个块是 512字节,这里的块和扇区是一 个意思, cnt 是要读取的块数量(十六进制) mmc read 00000000 800 10 //从SD 卡的第 2048(0x800)个块开始,读取 16(0x10) 个块的数据到 DRAM 的 0X00000000 地址处。 ### (七)[mmc write](https://zhida.zhihu.com/search?content_id=247212823&content_type=Article&match_order=1&q=mmc+write&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3NzAyOTkwMTUsInEiOiJtbWMgd3JpdGUiLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjoyNDcyMTI4MjMsImNvbnRlbnRfdHlwZSI6IkFydGljbGUiLCJtYXRjaF9vcmRlciI6MSwiemRfdG9rZW4iOm51bGx9.LXKg_FaBCN7BmFBcnAO27zqV7AoGgGom3OpvuzQ2opg&zhida_source=entity "mmc write") 命令 将数据写到MMC设备里,格式如下: mmc write addr blk# cnt 注意千万不要写 SD 卡或者 EMMC 的前两个块(扇区),里面保存着分区表信息 ### (八)[mmc erase](https://zhida.zhihu.com/search?content_id=247212823&content_type=Article&match_order=1&q=mmc+erase&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3NzAyOTkwMTUsInEiOiJtbWMgZXJhc2UiLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjoyNDcyMTI4MjMsImNvbnRlbnRfdHlwZSI6IkFydGljbGUiLCJtYXRjaF9vcmRlciI6MSwiemRfdG9rZW4iOm51bGx9.KI3SNARsYn9Nd6tjz8554VeE25jcuG0oqOEucCRR100&zhida_source=entity "mmc erase")命令 擦除 MMC 设备的指定块,命令格式如下: mmc erase blk# cnt blk 为要擦除的起始块,cnt 是要擦除的数量。 ## 七、其他命令 ### (一)reset命令 复位 ### (二)run命令 run 命令用于运行环境变量中定义的命令,比如可以通过"run bootcmd"来运行 bootcmd中的启动命令 ### (三)mtest命令 mtest 命令是一个简单的内存读写测试命令,可以用来测试自己开发板上的 DDR, 命令格式如下: Mtest \[start \[end \[pattern \[iterations\]\]\]

start 是要测试的 DRAM 开始地址,end 是结束地址

mtest 00000000 00001000 //测试 0x00000000~0x00001000

相关推荐
艾佳者2 小时前
Cookie、Session、Token 三者核心区别(易懂版)
网络
松涛和鸣2 小时前
69、Linux字符设备驱动实战
linux·服务器·网络·arm开发·数据库·驱动开发
devmoon2 小时前
30秒一键连接Polkadot区块链网络和测试网
网络·web3·区块链·智能合约·polkadot
开开心心就好2 小时前
图片校正漂白工具永久免费,矫正实时预览
网络·人工智能·windows·计算机视觉·计算机外设·电脑·excel
AAAAA92402 小时前
物联网海外网络摄像头市场分析:技术、合规与商业模式新趋势
网络·物联网
“αβ”2 小时前
IP协议内容补充
服务器·网络·网络协议·tcp/ip·智能路由器·nat·ip协议
٩( 'ω' )و2602 小时前
linux网络--基础概念
linux·网络
果粒蹬i2 小时前
【HarmonyOS】鸿蒙应用开发实战指南:构建网络数据列表应用
网络·华为·harmonyos
开开心心_Every2 小时前
电脑网速加速工具,无线有线叠加网络
网络·游戏·微信·pdf·电脑·excel·语音识别