当前位置: 首页 > article >正文

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启动就做如下环境变量定义


http://www.kler.cn/a/409736.html

相关文章:

  • 浅谈网络 | 传输层之套接字Socket
  • Node.js的http模块:创建HTTP服务器、客户端示例
  • torch.set_printoptions
  • 游戏引擎学习第22天
  • 【es6】原生js在页面上画矩形添加选中状态高亮及显示调整大小控制框(三)
  • Springboot 读取 resource 目录下的Excel文件并下载
  • git提交到远程仓库如何撤回?
  • Stable Diffusion 3 部署笔记
  • 开源电话机器人产品的优点是什么?
  • Linux系统中查看当前使用的显示管理器
  • 【FAQ】HarmonyOS SDK 闭源开放能力 — 公共模块
  • 电子应用设计方案-24:智能防火系统方案设计
  • XSS 与 CSRF 记录
  • 第一次shell作业
  • 民宿预定管理系统|Java|SSM|Vue| 前后端分离
  • 打造智能扩容新纪元:Kubernetes Custom Metrics深度解析
  • 使用 Elastic 收集 Windows 遥测数据:ETW Filebeat 输入简介
  • 记录eslint报错的情况
  • Leetcode141. 环形链表(HOT100)
  • 字符串编码
  • 数组的应用
  • Burp学习(1)
  • 【Linux课程学习】:环境变量:HOME,su与su - 的区别,让程序在哪些用户下能运行的原理,环境变量具有全局性的原因?
  • 【笔记】Linux下编译Python3.10.15为动态库同时正确处理OpenSSL3依赖
  • 搭建帮助中心,打造卓越的用户体验
  • 基于神经网络的流量异常检测