U-Boot命令之内存操作命令
Posted 行稳方能走远
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了U-Boot命令之内存操作命令相关的知识,希望对你有一定的参考价值。
参考:U-Boot命令之内存操作命令
作者:一只青木呀
发布时间: 2020-10-20 12:20:19
网址:https://blog.csdn.net/weixin_45309916/article/details/109178410
内存操作命令
内存操作命令就是用于直接对 DRAM 进行读写操作的,常用的内存操作命令有 md、 nm、mm、 mw、 cp 和 cmp。
命令 | 描述 |
---|---|
md | 用于显示内存值 |
nm | 用于修改指定地址的内存值 |
mm | 用于修改指定地址的内存值 |
mw | 用于使用一个指定的数据填充一段内存 |
cp | 用于将 DRAM 中的数据从一段内存拷贝到另一段内存中,或者把 NorFlash 中的数据拷贝到 DRAM 中 |
cmp | 用于比较两段内存的数据是否相等 |
1、 md 命令
md 命令用于显示内存值,格式如下:
md[.b, .w, .l] address [# of objects]
命令中的[.b .w .l]对应 byte、 word 和 long,也就是分别以 1 个字节、 2 个字节、 4 个字节来显示内存值。 address 就是要查看的内存起始地址, [# of objects]表示要查看的数据长度,这个数据长度单位不是字节,而是跟你所选择的显示格式有关。比如你设置要查看的内存长度为20(十六进制为 0x14),如果显示格式为.b 的话那就表示 20 个字节;如果显示格式为.w 的话就表示 20 个 word,也就是 202=40 个字节;如果显示格式为.l 的话就表示 20 个 long,也就是204=80 个字节。另外要注意:
uboot 命令中的数字都是十六进制的!不是十进制的!
比如你想查看以 0X80000000 开始的 20 个字节的内存值,显示格式为.b 的话,应该使用如下所示命令:
md.b 80000000 14
而不是
md.b 80000000 20
上面说了, uboot 命令里面的数字都是十六进制的,所以可以不用写“0x”前缀,十进制的 20 其十六进制为 0x14,所以命令 md 后面的个数应该是 14,如果写成 20 的话就表示查看32(十六进制为 0x20)个字节的数据。
2、 nm 命令
nm 命令用于修改指定地址的内存值,命令格式如下:
nm [.b, .w, .l] address
nm 命令同样可以以.b、 .w 和.l 来指定操作格式,比如现在以.l 格式修改 0x80000000 地址的数据为 0x12345678。输入命令:
nm.l 80000000
输入上述命令以后如下图所示:
在上图中, 80000000 表示现在要修改的内存地址, efffe177 表示地址 0x80000000 现在的数据,?后面就可以输入要修改后的数据 0x12345678,输入完成以后按下回车,然后再输入‘q’即可退出,如下图所示:
修改完成以后在使用命令 md 来查看一下有没有修改成功,如下图所示:
从上图可以看出,此时地址 0X80000000 的值变为了 0x12345678。
3、 mm 命令
mm 命令也是修改指定地址内存值的,使用 mm 修改内存值的时候地址会自增,而使用命令 nm 的话地址不会自增。比如以.l 格式修改从地址 0x80000000 开始的连续 3 个内存块(3*4=12个字节)的数据为 0X05050505,操作如下图所示:
从上图可以看出,修改了地址 0X80000000、 0X80000004 和 0X80000008 的内容为0x05050505。使用命令 md 查看修改后的值,结果如下图所示:
从上图可以看出内存数据修改成功。
4、 mw 命令
命令 mw 用于使用一个指定的数据填充一段内存,命令格式如下:
mw [.b, .w, .l] address value [count]
mw 命令同样可以以.b、 .w 和.l 来指定操作格式, address 表示要填充的内存起始地址, value为要填充的数据, count 是填充的长度。比如使用.l 格式将以 0X80000000 为起始地址的 0x10 个内存块(0x10 * 4=64 字节)填充为 0X0A0A0A0A,命令如下:
mw.l 80000000 0A0A0A0A 10
然后使用命令 md 来查看,如下图所示:
从上图可以看出内存数据修改成功.
5、 cp 命令
从上图可以看出内存数据修改成功.
cp [.b, .w, .l] source target count
cp 命令同样可以以.b、 .w 和.l 来指定操作格式, source 为源地址, target 为目的地址, count为拷贝的长度。我们使用.l 格式将 0x80000000 处的地址拷贝到 0X80000100 处,长度为 0x10 个内存块(0x10 * 4=64 个字节),命令如下所示:
cp.l 80000000 80000100 10
结果如下图所示:
在上图中,先使用 md.l 命令打印出地址 0x80000000 和 0x80000100 处的数据,然后使用命令cp.l将0x80000000处的数据拷贝到0x80000100处。最后使用命令md.l查看0x80000100处的数据有没有变化,检查拷贝是否成功。
6、 cmp 命令
cmp 是比较命令,用于比较两段内存的数据是否相等,命令格式如下:
cmp [.b, .w, .l] addr1 addr2 count
cmp 命令同样可以以.b、 .w 和.l 来指定操作格式, addr1 为第一段内存首地址, addr2 为第二段内存首地址, count 为要比较的长度。我们使用.l 格式来比较 0x80000000 和 0X80000100 这两个地址数据是否相等,比较长度为 0x10 个内存块(16 * 4=64 个字节),命令如下所示:
cmp.l 80000000 80000100 10
结果如下图所示:
从上图可以看出两段内存的数据相等。 我们再随便挑两段内存比较一下,比如地址0x80002000 和 0x800003000,长度为 0X10,比较结果如下图所示:
从上图可以看出, 0x80002000 处的数据和 0x80003000 处的数据就不一样.
以上是关于U-Boot命令之内存操作命令的主要内容,如果未能解决你的问题,请参考以下文章