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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/922873.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Cannal实现MySQL主从同步环境搭建

大家好,我是袁庭新。 在多数情况下,客户端往往会优先获取缓存中的数据。然而,当缓存数据与数据库中的实际数据存在显著不一致时,可能会导致严重的后果。因此,确保数据库与缓存数据之间的一致性变得至关重要&#xff0c…

C++《二叉搜索树》

在初阶数据结构中我学习了树基础的概念以及了解了顺序结构的二叉树——堆和链式结构二叉树该如何实现,那么接下来我们将进一步的学习二叉树,在此会先后学习到二叉搜索树、AVL树、红黑树;通过这些的学习将让我们更易于理解后面set、map、哈希等…

C++ —— 以真我之名 如飞花般绚丽 - 智能指针

目录 1. RAII和智能指针的设计思路 2. C标准库智能指针的使用 2.1 auto_ptr 2.2 unique_ptr 2.3 简单模拟实现auto_ptr和unique_ptr的核心功能 2.4 shared_ptr 2.4.1 make_shared 2.5 weak_ptr 2.6 shared_ptr的缺陷:循环引用问题 3. shared_ptr 和 unique_…

springboot项目使用maven打包,第三方jar问题

springboot项目使用maven package打包为可执行jar后,第三方jar会被打包进去吗? 答案是肯定的。做了实验如下: 第三方jar的项目结构及jar包结构如下:(该第三方jar采用的是maven工程,打包为普通jar&#xf…

第六届智能控制、测量与信号处理国际学术会议 (ICMSP 2024)

重要信息 2024年11月29日-12月1日 中国陕西西安石油大学雁塔校区 大会官网:www.icmsp.net 大会简介 第六届智能控制、测量与信号处理国际学术会议(ICMSP 2024)由西安石油大学、中海油田服务股份有限公司、浙江水利水电学院与中国石油装备…

设计LRU缓存

LRU缓存 LRU缓存的实现思路LRU缓存的操作C11 STL实现LRU缓存自行设计双向链表 哈希表 LRU(Least Recently Used,最近最少使用)缓存是一种常见的缓存淘汰算法,其基本思想是:当缓存空间已满时,移除最近最少使…

跨平台应用开发框架(1)----Qt(组件篇)

目录 1.Qt 1.Qt 的主要特点 2.Qt的使用场景 3.Qt的版本 2.QtSDK 1.Qt SDK 的组成部分 2.安装 Qt SDK 3.Qt SDK 的优势 3.Qt初识 1.快速上手 widget.cpp mian.cpp widget.h Helloworld.pro 2.对象树 3.坐标系 4.信号和槽 1. 信号和槽的基本概念 2. 信号和槽的…

Vue3+SpringBoot3+Sa-Token+Redis+mysql8通用权限系统

sa-token支持分布式token 前后端代码,地球号: bright12389

专题二十三_动态规划_回文串系列问题_算法专题详细总结

目录 动态规划 回文串系列问题 1. 回⽂⼦串(medium) 解析: 解决回文串问题,这里提供三个思路: 1.中心扩展法:n^2 / 1 2.马拉车算法:n / n 3.动态规划算法:n^2 / n^2 1.状态表…

ES实用面试题

一、es是什么,为什么要用它? ES通常是Elasticsearch的简称,它是一个基于Lucene构建的开源搜索引擎。Elasticsearch以其分布式、高扩展性和实时数据分析能力而闻名,广泛用于全文搜索、日志分析、实时监控等多种场景。 基本特点&am…

实现在两台宿主机下的docker container 中实现多机器通讯

基于我的实验背景 上位机:ubuntu 20.04 (docker humble 22.04) 下位机:ubuntu 22.04(docker noetic 20.04) 目标:实现在上位机中的docker container 容器的22.04环境去成功远程访问 非同网段的下位机的20.04的contai…

FakeLocation Linux | Windows关于使用教程一些规范说明

前言:使用教程(FakeLocation版本请使用1.2.xxx)| (1.3.xxx 未测试) 环境模块,是指代FakeLocation开启以后会把环境弄的异常,环境模块可以保证环境安全Dia 作为软件需要在Lsp框架里面勾选激活使用,并且开启增强模式FakeLocation 请…

指针的奥秘:深入探索内存的秘密

前言 在计算机编程的广阔天地中,指针作为一种独特的数据类型,它不仅是C语言的核心,也是理解计算机内存管理的基石。指针的概念虽然强大,但对于初学者来说,它常常是学习过程中的一个难点。本文旨在揭开指针的神秘面纱&a…

Mairadb 最大连接数、当前连接数 查询

目录 查询数据库 最大连接数 查询当前连接总数 环境 Mariadb 10.11.6 跳转mysql数据库: 查询数据库 最大连接数 show variables like max_connections; 注意; 这个版本不能使用 : show variables like ‘%max_connections%’; 会报错 &#xff…

电影风格城市夜景旅拍Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程 电影风格城市夜景旅拍通过 Lightroom 调色,将城市夜晚的景色打造出如同电影画面般的质感和氛围。以独特的色彩和光影处理,展现出城市夜景的魅力与神秘。 预设信息 调色风格:电影风格预设适合类型:人像,街拍…

代码管理之Gitlab

文章目录 Git基础概述场景本地修改未提交,拉取远程代码修改提交本地,远程已有新提交 GitIDEA引入Git拉取仓库代码最后位置 Git基础 概述 workspace 工作区:本地电脑上看到的目录; repository 本地仓库:就是工作区中隐…

【FPGA】Verilog:利用 4 个串行输入- 串行输出的 D 触发器实现 Shift_register

0x00 什么是寄存器 寄存器(Register)是顺序逻辑电路中使用的基本组成部分之一。寄存器用于在数字系统中存储和处理数据。寄存器通常由位(bit)构成,每个位可以存储一个0或1的值。通过寄存器,可以设计出计数器、加法器等各种数据处理电路。 0x01 寄存器的种类 基于 D 触发…

HTML实现 扫雷游戏

前言: 游戏起源与发展 扫雷游戏的雏形可追溯到 1973 年的 “方块(cube)” 游戏,后经改编出现了 “rlogic” 游戏,玩家需为指挥中心探出安全路线避开地雷。在此基础上,开发者汤姆・安德森编写出了扫雷游戏的…

微信小程序+Vant-自定义选择器组件(单选带筛选

实现效果 筛选是filter&#xff0c;搜索框如有显隐需要&#xff0c;需自行添加配置显隐参数弹出层高度样式需要手动修改&#xff0c;需自行添加配置高度参数.json文件配置"component": true, 实现代码 组件代码 <van-popup show"{{ show }}" posit…

【Linux课程学习】:环境变量:HOME,su与su - 的区别,让程序在哪些用户下能运行的原理,环境变量具有全局性的原因?

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux课程学习 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 HOME环境变量&#xff1a; PWD环境变量&#…