Linux——Uboot命令使用

什么是Uboot?

1)Uboot是一个裸机程序,比较复杂。类似我们PC机的BIOS程序。

2)Uboot就是一个bootloader,作用就是用于启动Linux或者其他系统,Uboot最主要的工作是初始化DDR,因为Linux的运行是运行在DDR里面的。(Linux镜像编译出来如果不做裁剪的话有四五兆字节那么大,一般芯片内部ram没有那么大,无法运行,必须放到DDR中运行),所以如果要运行Linux,就要先初始化好DDR,才能在DDR中运行Linux系统。

一般Linux镜像(叫做zimage或者是uimage)+设备树(.dtb)存放在SD、EMMC、NAND、SPI FLASH等等外置存储区域。

Uboot可以引导Linux镜像从外置flash拷贝到DDR中,再去启动。

Uboot不仅能启动Linux,也可以启动其他系统,比如vxworks。

Uboot是个通用的bootloader,支持多种架构。

Uboot编写简要流程

最直接的方式就是官网下载,但是不可能编写Uboot的时候考虑到所有芯片的需求,如果需要一些特别的驱动,就需要SOC(系统级芯片)厂商自己去更改和添加原始Uboot的一些内容,做开发板的厂商也需要根据SOC厂商做好的Ubooot进行修改,从而来适应自己制作的开发板。

编写好的Uboot程序的编译

(1)通过FTP传输(FileZilla)在Windows系统下将正点原子编写的Uboot压缩包传输到Ubuntu

(2)通过命令进行解压缩

v显示过程,x解压缩,j表示tar.bz2文件,f使用归档文件

(3)512MB(DDR3)+8GB(EMMC)核心板使用如下命令来编译Uboot

清理编译文件

配置Uboot

文件夹下会生成一个.config文件,使用ls -a命令查看

编译Uboot

V=1的作用是把编译的过程详细打印出来。

编译完成之后会在文件夹里生成一个u-boot.bin的文件,与我们的裸机实验一样生成一个可执行文件,但是我们要运行程序必须在.bin文件里添加头部信息(主要有IVT镜像向量表,包含了一系列的地址信息、BOOT Data包含了启动时需要的一些关键数据,比如镜像要拷贝到哪个地址、拷贝的大小等信息、DCD是设备配置数据,主要用于初始化系统时钟、DDR等设备信息。),添加完之后会生成u-boot.imx文件,uboot是通过/tools/mkimage这样的一个工具添加头部信息的,如下:

Uboot命令的使用

信息查询命令

常用的信息查询命令有3个,分别是bdinfo、printenv和version。

bdinfo命令可以得出 DRAM 的起始地址和大小、启动参数保存起始地址、波特率、 sp(堆栈指针)起始地址等信息,如下:

printenv命令用于输出环境变量信息。Uboot的环境变量是可以修改的,有专门的命令来修改Uboot的环境变量。

version命令用来显示版本号,下图打印出的信息表示用的Uboot版本是2016年的,上次编译时间是2024年,用的是arm-linux-gnueabihf-gcc编译器。

环境变量操作命令

1)修改环境变量

环境变量的修改涉及到两个命令,setenv命令用于设置环境变量或者修改环境变量,saveenv命令将修改后的环境变量保存到flash中。

例如我们要将延时时间修改成5秒后才启动linux内核,可以

如果我们修改的环境变量的值有空格,我们就需要将其值用单引号括起来

2)新建环境变量

命令 setenv 也可以用于新建命令,用法和修改环境变量一样,比如我们新建一个环境变量 author,author 的值为我的名字拼音:zhangzs,那么就可以使用如下命令:

3)删除环境变量

删除环境变量的命令跟设置环境变量命令相同,只要在变量后面赋空值即可

内存操作命令

内存操作命令就是直接对DRAM进行读写操作的,常用的内存操作命令有md、nm、mm、mw、cp和cmp。

1)md命令

格式如下:

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

显示格式[.b,.w,.l]对应byte、word和long,也就是1个字节、2个字节和4个字节来显示内存值。,address是要查看内存的起始地址,[# of objects]表示要查看的数据长度,比如要显示的内存长度为20,显示格式为.b的话就是20个字节,显示格式为.w的话就是20*2个字节,显示格式为.l的话就是20*4个字节。

uboot命令中的数据都是十六进制的!不是十进制!!

例如要查看以0x80000000开始的20个字节的内存值,显示格式位.b,(0x14表示20)使用如下命令:

2)nm命令

nm命令用于修改指定地址的内存值,修改完之后输入q退出

3)mm命令

mm命令也是修改指定地址的内存值的,但是相比于nm命令,mm命令修改完一个内存值之后地址会自增。

4)mw命令

命令mw用于使用一个指定的数据填充一段内存

5)cp命令

cp是数据拷贝指令,用于将DRAM中的数据从一段内存拷贝到另一段内存,或者从NOR FLASH中拷贝到DRAM

6)cmp命令

cmp是比较命令,用于比较两段内存的数据是否相等

网络操作命令

在进行网络操作命令之前,我们需要将电脑和开发板连接至同一路由器(笔记本电脑也可以无线连接,但要确保虚拟机有网络),且我们需要将开发板和虚拟机设置为同一网段,由于我们的开发板连接了路由器,所以要是处于同一网段我们需要手动修改Ubuntu的ip,如下:

DNS服务器记得设置!不然可能会没网!!

如果还是没网的话设置一下虚拟机:

根据实际设置环境变量

1)ping命令

作用是检测处于同一网段的机器能不能相互通信,现在我们的开发板与我们的虚拟机处于同一网段

2)dhcp命令

从路由器获取ip地址

3)nfs命令

通过nfs(网络文件系统)可以在计算机之间通过网络来分享资源

格式:nfs [loadAddress] [[hostIPaddr:]bootfilename]

loadAddress 是要保存的 DRAM 地址,[[hostIPaddr:]bootfilename]是要下载的文件地址。这 里我们将正点原子官方编译出来的 Linux 镜像文件 zImage 下载到开发板 DRAM 的 0x80800000 这个地址处。

如果出现Loading: T T T T T T T T /Loading: *** ERROR: File lookup fail这些情况,可以参考我的另一篇博客Linux------Uboot使用NFS出现Loading: T T T T T T T T /Loading: *** ERROR: File lookup fail-CSDN博客

4)tftp命令

tftp 命令的作用和 nfs 命令一样,都是用于通过网络下载东西到 DRAM 中,只是 tftp 命令 使用的 TFTP 协议,Ubuntu 主机作为 TFTP 服务器。因此需要在 Ubuntu 上搭建 TFTP 服务器, 需要安装 tftp-hpa 和 tftpd-hpa,命令如下:

创建文件

在文件中输入如下内容

然后启动 tftp 服务

打开文件tftpd-hpa

修改

重启tftp

tftp服务器已经搭建好了

一点要确保我们已经给了tftp文件夹和zImage权限,不然会传输失败!!

EMMC和SD卡操作命令

1)mmc命令

"mmc"是一系列命令,其后可以跟不同的参数,输出?mmc或者mmc -help即可查看mmc相关的命令:

FAT格式文件操作命令

1)fatinfo命令

fatinfo 命令用于查询指定 MMC 设备分区的文件系统信息

命令的作用是查询emmc的分区1的文件系统信息(mmc表示接口)

2)fatls命令

fatls命令的作用是查询FAT格式设备的目录和文件信息

命令的作用是查询SD卡的分区1的目录和文件信息

3)fstype命令

查询设备的文件格式

fat格式存放Linux的镜像和设备树,ext4格式存放Linux的根文件系统(rootfs)

4)fatload命令

fatload 命令用于将指定的文件读取到 DRAM 中

命令的作用是将mmc接口的设备1的分区1的zImage文件写到DRAM的80800000位置

5)fatwrite命令

将DRAM的数据写到MMC设备中

语句的作用是将DRAM的0x80800000位置的zImage文件写到MMC设备1的分区1,大小为0x6788f8

EXT格式文件系统操作命令

uboot有ext2和ext4两种格式文件系统的操作命令。

常用的命令为ext2load、ext2ls、ext4load、ext4ls 和 ext4write,使用方式跟FAT格式文件系统一样。

BOOT操作命令

1)bootz命令

bootz 命令用于启动 zImage 镜像文件

2)bootm命令

bootm 和 bootz 功能类似,但是 bootm 用于启动 uImage 镜像文件

3)boot命令

boot命令是来启动Linux系统,boot会读取环境变量bootcmd来启动Linux系统

如果我们要通过网络来启动Linux,可以进行如下操作

设置好环境变量bootcmd然后保存,通过boot命令来启动Linux系统,如果要从emmc启动就做如下环境变量定义

相关推荐
虾..42 分钟前
Linux 软硬链接和动静态库
linux·运维·服务器
Evan芙1 小时前
Linux常见的日志服务管理的常见日志服务
linux·运维·服务器
꧁坚持很酷꧂2 小时前
解决虚拟机Ubuntu22.04连接了串口设备但终端没有显示
ubuntu
hkhkhkhkh1233 小时前
Linux设备节点基础知识
linux·服务器·驱动开发
HZero.chen4 小时前
Linux字符串处理
linux·string
张童瑶4 小时前
Linux SSH隧道代理转发及多层转发
linux·运维·ssh
汪汪队立大功1234 小时前
什么是SELinux
linux
石小千4 小时前
Linux安装OpenProject
linux·运维
柏木乃一4 小时前
进程(2)进程概念与基本操作
linux·服务器·开发语言·性能优化·shell·进程
Lime-30904 小时前
制作Ubuntu 24.04-GPU服务器测试系统盘
linux·运维·ubuntu