使用dd+hexdump命令修改环境变量的值和升级uboot

news2024/11/15 23:48:52

前言

这篇写的较细,使用dd擦除emmc本来就是比较危险的事情,所以一定要细致。哪里没看明白的,赶紧留言问我,可不能存有侥幸心理。

思路大概就是:

1 先从emmc把数据读出来,放一个镜像文件里,使用hexdump -C查看该文件,主要是验证环境变量的位置对不对。最重要是还是一点一点熟悉命令。

2 先写镜像文件,验证一下能不能写成功

3 前面都验证好了,再写物理磁盘。

4 最后升级uboot。

一 使用fdisk -l查看磁盘状态

首先,找到磁盘挂载状态:已知,uboot位于第二sectors开始,fdisk位于第0x600开始,占用0x10个sectors,且每个sector是512字节,即占用8192字节,执行fdisk l

root@hehe:/dev# fdisk -l
Disk /dev/mmcblk1: 7.3 GiB, 7818182656 bytes, 15269888 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x6a30ec95

Device         Boot  Start      End  Sectors  Size Id Type
/dev/mmcblk1p1       20480   282623   262144  128M  c W95 FAT32 (LBA)
/dev/mmcblk1p2      282624 15269887 14987264  7.2G 83 Linux




Disk /dev/mmcblk1boot1: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mmcblk1boot0: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

二 使用dd命令从1536扇区读数据

从命令结果可知,前10M空间是没有没挂载到系统中的。使用dd命令读取/dev/mmcblk1的前10M的空间,并输出到boot.img文件。

root@hehe:~# dd if=/dev/mmcblk1 of=uboot.img bs=512 count=20480
20480+0 records in
20480+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 0.762808 s, 13.7 MB/s
root@hehe:~# ls -lsh boot.img
11M -rw-r--r-- 1 root root 10M Oct 15 17:30 boot.img
root@hehe:~# 

使用hexdump查看uboot.img0x600 X 512地址,大小为8192字节的数据。

0x600X512 = 1536 X 512 = 

hexdump -C -s 786432 -n 8192,效果如下:读到环境变量头了。

root@hehe:~# hexdump -C uboot.img -s 786432 -n 8192
000c0000  e5 9d 42 8b 55 55 49 44  5f 49 44 30 3d 35 64 34  |..B.UUID_ID0=5d4|
000c0010  38 30 30 63 34 00 55 55  49 44 5f 49 44 31 3d 32  |800c4.UUID_ID1=2|
000c0020  63 30 61 62 31 64 37 00  62 61 75 64 72 61 74 65  |c0ab1d7.baudrate|
000c0030  3d 31 31 35 32 30 30 00  62 6f 61 72 64 5f 6e 61  |=115200.board_na|
000c0040  6d 65 3d 45 56 4b 00 62  6f 61 72 64 5f 72 65 76  |me=EVK.board_rev|
##省略了很多很多

研究发现,可以直接使用dd的参数skip,跳过n个块来读,这样可以精准的读到8192字节的数据:

skip=N          skip N ibs-sized blocks at start of input

dd skip=1536 if=/dev/mmcblk1 of=env.img bs=512 count=16

root@hehe:~# dd skip=1536 if=/dev/mmcblk1 of=env.img bs=512 count=16
16+0 records in
16+0 records out
8192 bytes (8.2 kB, 8.0 KiB) copied, 0.00125733 s, 6.5 MB/s
root@hehe:~# 

使用hexdump -C查看新的env.img文件

root@host:/# hexdump -C env.img
00000000  d3 57 bd dc 55 55 49 44  5f 49 44 30 3d 35 64 34  |.W..UUID_ID0=5d4|
00000010  36 38 66 33 33 00 55 55  49 44 5f 49 44 31 3d 34  |68f33.UUID_ID1=4|
00000020  35 32 66 39 31 64 37 00  62 61 75 64 72 61 74 65  |52f91d7.baudrate|
00000030  3d 31 31 35 32 30 30 00  62 6f 6f 74 5f 66 64 74  |=115200.boot_fdt|

三 擦除读回来的uboot.img1536扇区开始的8192字节数据

下面就是擦除这块数据了,把他们全写成0吧;

这里又用到dd的另一参数,跳过N块的参数

seek=N          Skip N output blocks

先尝试制作一个8192字节的zero.img镜像文件。

dd if=/dev/zero of=zero.img bs=512 count=16,执行效果如下所示:

root@host:/# dd if=/dev/zero \of=zero.img bs=512 count=16
16+0 records in
16+0 records out
root@host:/# ls -lsh zero.img
     8 -rw-rw-rw-    1 root     root        8.0K Jan  1 00:20 zero.img
root@host:/# 

使用hexdump -C测试该文件:

root@host:/# hexdump -C zero.img
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00002000
root@host:/#

注意

我原来使用/dev/null作为0的输入源文件,结果显示dd: can't open '/dev/null of=zero.img': No such file or directory,然后就换成了/dev/zero作为输入源。

然后再将zero.img文件的内容写入到uboot.img的0x600(1536)块的地方:写16个块,就是16X512=8192字节。

执行dd if=zero.img seek=1536 of=uboot.img bs=512 count=16

root@host:/# dd if=zero.img seek=786432 of=uboot.img bs=512 count=16
16+0 records in
16+0 records out
root@host:/#

hexdump -C uboot.img -s 786432 -n 8192 验证是否写成功。

直接用/dev/zero作为输入源:

执行dd if=/dev/zero of=uboot.img seek=1536 bs=512 count=16

root@host:/# dd if=/dev/zero of=uboot.img seek=1536 bs=512 count=16
16+0 records in
16+0 records out
root@host:/#

执行hexdump -C uboot.img -s 786432 -n 8192:

root@host:/# hexdump -C uboot.img -s 786432 -n 8192
000c0000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000c2000
root@host:/#

四 使用dd命令正式擦除指定扇区的数据

经过前面小心翼翼的试探,终于开始正式擦emmc了,这个时候,还是要保证所操作的设备,即便是擦坏了,也有办法能恢复,否则的暂时别试,先看我来一步一步怎么踩坑的。

首先,仔细填写命令,一定不能出错,这些参数都是用来在我自己的板子上测试的,如果是自己的板子,一定要搞清楚,这么参数啥意思

dd if=/dev/zero of=/dev/mmcblk1 seek=1536 bs=512 count=16

/dev/zero :0输入源

/dev/mmcblk1:要擦除的设备文件,我这里就是emmc

seek=1536 :跳过的bs数量

bs=512:块的大小

count=16 :一共要擦除16个bs,就是16Xbs = 16X512 = 8192字节。

root@host:/# dd if=/dev/zero of=/dev/mmcblk1 seek=1536 bs=512 count=16
16+0 records in
16+0 records out
root@host:/#

使用hexdump -C 看看,完整命令是:

hexdump -C /dev/mmcblk1 -s 786432 -n 8192,执行效果:

root@host:/# hexdump -C /dev/mmcblk1 -s 786432 -n 8192
000c0000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000c2000
root@host:/#

重启,真的成功了。

五 使用dd升级uboot

先查看当前uboot的时间

查看升级之前uboot的编译时间:

准备升级文件 u-boot.imx

升级uboot,升级文件是u-boot.imx,不是u-boot.bin。如下所示,该文件大小是318464字节,换算成512字节的块就是318464/512 = 622块,使用科学计算器计算,如果计算得到的不是整数,说明文件错误,就不要升级了,先检查文件的来源。

root@hehe:~# ls -ls u-boot.imx
316 -rw-r--r-- 1 root root 318464 Oct 15 14:45 u-boot.imx
root@hehe:~#

  

编辑升级命令

dd if=/u-boot.imx of=/dev/mmcblk1 seek=2 bs=512 count=622

大部分前面都说过了,这里seek=2是为什么?

我的板子的u-boot是从第二的扇区开始存的,所以这里要偏移2个扇区,不是2个字节。

开始升级

root@hehe:~# dd if=/u-boot.imx of=/dev/mmcblk1 seek=2 bs=512 count=622
622+0 records in
622+0 records out
318464 bytes (318 kB, 311 KiB) copied, 0.008746 s, 36.4 MB/s
root@hehe:~#

重启,如果能正常启动,基本就是成功了。 

重启后查看最新的u-boot时间:Dec 08 2022,2022年12月8号。没错,升级成功了。

小结

        总结一下,两条命令,根据实际情况修改对应的参数,例如uboot的大小等等。

擦除使用      

dd if=/dev/zero of=/dev/mmcblk1 seek=1536 bs=512 count=16

升级使用

dd if=/u-boot.imx of=/dev/mmcblk1 seek=2 bs=512 count=622

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【整理】Python全栈技术学习路线

【整理】Python全栈技术学习路线【阶段一】Python基础Linux【阶段二】多任务编程服务器前端基础【阶段三】数据库mini Web框架【阶段四】Dhango框架美多商城项目【阶段五】DRF框架美多商城后台【阶段六】项目部署Flask框架Hm头条【阶段七】人工智能基础推荐系统基础Hm头条推荐系…

带你了解extern “C“

1.extern “C” 这个语法是c的语法。我们知道在一个.c文件中调用另一个.c中实现的函数是没有任何问题的,一个.cpp文件调用另一个.cpp文件中实现的函数也是没有问题的。但是我们如果想要在一个.cpp文件调用另一个.c文件中实现的函数,或者在一个.c文件中调…

双调序列

目录 双调序列 思路: 代码: 时间复杂度: 总结: 题目链接: 双调序列 题目描述: XJ编程小组的童鞋们经常玩一些智力小游戏,某月某日,小朋友们又发明了一种新的序列:双调序列,所谓的双调呢主要是满足如下条件描述…

TensorFlow之分类模型-2

1 基本概念 2 文本分类与情感分析 获取数据集 加载数据集 训练数据集 性能设置 为了提升训练过程中数据处理的性能,keras技术框架提供数据集缓存的功能,使用缓存可以避免读取磁盘数据集时由于IO消耗太多而出现性能瓶颈的问题,如果数据集…

操作系统的主要功能是什么

操作系统的主要功能是进程管理、存储管理、设备管理、文件管理、作业管理。 计算机系统的资源可分为设备资源和信息资源两大类。 操作系统位于底层硬件与用户之间,是两者沟通的桥梁。 1、进程管理,其工作主要是进程调度,在单用户单任务的情…

opcj2-盘点几个常见的Java开源脚手架

很多人抱怨自己是CURDer,很多时候就是在简单的修修改改。如果不书序SSM(Spring、SpringMVC和Mybatis)套路的人可能开始的时候会感觉非常吃力。但是熟悉之后发现其实就这么回事。SpringMVC负责响应对外接口,Mybatis负责数据库的访问…

TF4-圈子功能

TF4-圈子功能1、首页推荐1.1、接口分析1.2、功能实现1.2.1 controller1.2.2 service1.2.3 API接口1.2.4 请求dto对象2、MongoDB集群3、圈子功能2.1、功能说明1.2、实现方案分析1.3、技术方案(重点)1.4、表结构设计4、圈子实现3.1、环境搭建3.1.1、mongo主键自增3.1.2、实体类Mo…

基于matlab的SVM支持向量机分类仿真,核函数采用RBF函数

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 支持向量机(support vector machines, SVM)是二分类算法,所谓二分类即把具有多个特性(属性)的数据分为两类,目前主流机器学…

如何清理 docker 磁盘空间 附讲解(全)

目录前言1. Docker System 命令1.1 docker system df1.2 docker system prune2. 冗余容器或镜像3. 限制容器日志前言 补充docker知识点,可看我之前的文章:Docker零基础从入门到精通(全) docker 镜像特别容易占空间,稍…

基于Redis实现高性能延时消息队列

最近在倒腾自建博客后端系统,需要用到延时任务的功能,但手头只有一套MySQL和Redis,如果搞一套MQ成本有点大,于是想着用redis实现延时消息队列。有些场景用数据库的定时扫表也能简单实现延时消息的功能,不过对于我这边的…

Bitmap,布隆过滤器初步了解

布隆过滤器使用教程 文章目录布隆过滤器使用教程1.背景2.什么是Bitmap3.布隆过滤器3.1 什么是布隆过滤器3.2 布隆过滤器的作用3.3 布隆过滤器的基本原理4.布隆过滤器的实现Guava和Redisson4.1 实现思路4.2 SpringBoot实现这些操作Bitmap,guava,redisson布隆过滤器1.背景 最近公…

redis知识点汇总

一、Redis的数据类型和数据结构 1、Redis五种数据类型 String(字符串)、List(列表)、Hash(哈希)、Set(集合)和Sorted Set(有序集合)。 2、Redis的底层数据…

C# 数据类型分值类型及引用类型

一 程序中的变量与常量 程序的基本任务是:对数据进行处理; 数据分为变量(variable)与常量(literal) int age18; 变量是值可以改变,本质上是内存的空间,用来存储信息 常量的值是固定的,直接写出来的,称字面…

点击按钮,下载文件

实现文件的下载功能 1、使用a标签 直接下载仅适用于浏览器无法识别的文件。 如果是浏览器支持的文件格式&#xff0c;如html、jpg、png、pdf等&#xff0c;则不会触发文件下载&#xff0c;而是直接被浏览器解析并展示 <ahref"http://xxxxxx.rar"download>下载…

vue中的性能优化

文章目录一、Vue为什么要做性能优化二、如何做vue的性能优化1. 网络请求优化link标签项目静态资源压缩懒加载利用浏览器的缓存机制高效复用项目文件总结2. 代码优化3. 用户体验优化场景1场景2一、Vue为什么要做性能优化 性能优化的目的是使网站的加载速度更快&#xff0c;用户…

【语音处理】基于自适应差分脉冲编码调制(ADPCM)的实现研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步进步&#xff0c;matlab项目目标合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信息&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算…

音视频直播系统之 WebRTC 中的协议UDP、TCP、RTP、RTCP详解

一、UDP/TCP 如果让你自己开发一套实时互动直播系统&#xff0c;在选择网络传输协议时&#xff0c;你会选择使用UDP协议还是TCP协议 假如使用 TCP 会怎样呢&#xff1f;在极端网络情况下&#xff0c;TCP 为了传输的可靠性&#xff0c;将会进行反复重发信息的操作 在 TCP 协议…

Nagios篇之Nagios服务关联飞书实现消息告警

一、前言 通常情况下&#xff0c;我们在利用Nagios监控来做服务器监控时&#xff0c;告警是必不可少的&#xff0c;以便于运维人员能够及时发现异常&#xff0c;进而处理问题&#xff0c;所以关联Nagios就变得极为重要。 Nagios关联告警的形式很多&#xff0c;可以进行短信推送…

wpf-ListView中放置可动态调节范围的刻度尺

需求描述 某个ListView占据整个窗口&#xff0c;当窗口的宽度发生改变时&#xff0c;某一列中显示的、某一行的字符数目&#xff0c;能跟随窗口宽度变化而增减。 下面是我做完的效果&#xff1a;&#xff08;只展示窗口的一部分&#xff09; 此时是窗口缩放的极限&#xff0…

为什么全光谱台灯对孩子眼睛好呢?台灯全光谱到底是什么意思

相信大家在购买台灯时有经常看到“全光谱”、“高显色”等关键词&#xff0c;其实这指的是台灯的某方面特性&#xff0c;所谓全光谱&#xff0c;就是指光线的光谱成分完全&#xff0c;与自然光别无二致。 我们都知道&#xff0c;一束自然太阳光不是由某个单一成分构成&#xff…