IMX6ULL移植篇-uboot的内存命令

一.  uboot 内存操作命令

内存操作命令就是用于直接对 DRAM 进行读写操作的, 这里主要学习的 uboot 常用的内存操作命令 包括: md 命令,nm 命令,mm 命令,mw 命令,cp 命令,cmp 命令。
这些命令都是在 uboot的命令模式下可以使用的。
uboot的命令模式:当开发板上电时立刻按下回车键,这时开发板打印信息停留在 uboot启动时刻,这就是 uboot的命令模式。

下来具体学习以上几种内存操作命令。

1.  md 命令

显示内存的值。格式如下:

md[.b, .w, .l] address [# of objects]
[.b .w .l] 对应 byte word long ,也就是分别以 1 个字节、 2 个字节、 4 个字节 来显示内存值。 address 是要查看的内存起始地址,
[# of objects] 表示要查看的数据长度,这 个数据长度单位不是字节,而是跟你所选择的显示格式有关。

注意:uboot 命令中的数字都是十六进制的!不是十进制的!

例如,查看以 0X80000000 开始的 20 个字节的内存值,显示格式为 .b 的话,可以使用的命令为
"md.b 80000000 14", 开发板操作如下:
=> md.b 80000000 14
80000000: f5 fb ef f2 be 4d ea 97 7e b7 7b fb f9 ef cb c6    .....M..~.{.....
80000010: bd fe fb 57   

2.   nm 命令

用于修改指定地址的内存值。

令同样可以以.b.w .l 来指定操作格式,格式如下:

nm [.b, .w, .l] address
例如,现在以 .l 格式修改 0x80000000 地址 的数据为 0x12345678

输入命令,如下:

=> nm.l 80000000 
80000000: f2effbf5 ? 
80000000 表示现在要修改的内存地址, 0500e031 表示地址 0x80000000 在的数据,
问号后面就可以输入要修改后的数据 0x12345678 ,输入完成以后按下回车,然后再输
入 ‘ q ’ 即可。
如下所示:
=> nm.l 80000000 
80000000: f2effbf5 ? 12345678
80000000: 12345678 ? q

查看是否更改成功,如下查看:

=> md.l 80000000 1
80000000: 12345678

3.  mm 命令

也是修改指定地址的内存值的,使用 mm 修改内存值的时候地址会自增,而使用nm 命令 地址不会自增。

例如,以 .l 格式修改从地址 0x80000000 开始的连续 3 个内存块 (3*4=12 个字节 ) 的数据分别为11111111,22222222,33333333。
操作如下:
=> mm.l 80000000 
80000000: 12345678 ? 11111111
80000004: 97ea4dbe ? 22222222
80000008: fb7bb77e ? 33333333
8000000c: c6cbeff9 ? q

可以通过 md命令查看是否更改成功:

=> md.l 80000000 3
80000000: 11111111 22222222 33333333 

4.  mw 命令

用于使用一个指定的数据填充一段内存。

同样可以以 .b .w .l 来指定操作格式, address 表示要填充的内存起始地址, value 为要填充的数据, count 是填充的长度。

格式如下:

mw [.b, .w, .l] address value [count]

 
例如,使用 .l 格式将以 0X80000000 为起始地址的 0x05 内存块 (0x05 * 4=20 字节 ) 填充为 0X0A0A0A0A ,命令如下:
mw.l 80000000 0A0A0A0A 5

操作如下:

=> mw.l 80000000 0A0A0A0A 5
=> md.l 80000000 5
80000000: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a    ................
80000010: 0a0a0a0a                               ....

5.  cp 命令

数据拷贝命令,用于将 DRAM 中的数据从一段内存拷贝到另一段内存中,或者把 Nor Flash 中的数据拷贝到 DRAM 中。

命令格式如下:

cp [.b, .w, .l] source target count
cp 命令同样可以以 .b .w .l 来指定操作格式, source 为源地址, target 为目的地址, count
为拷贝的长度。

例如,我们使用 .l  格式将 0x80000000 处的地址拷贝到 0X80000100 处,长度为 0x05 内存块(0x05 * 4=20 个字节)

首先,查看一下目的地址的 数据,如下所示:
=> md.l 80000100 5
80000100: fd5b7df5 eaee2afd dff175dd fbeeafaf    .}[..*...u......
80000110: 1b5f5fdf  

开始拷贝数据,输入命令如下:

=> cp.l 80000000 80000100 5

确认是否拷贝成功,如下:

=> md.l 80000100 5
80000100: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a    ................
80000110: 0a0a0a0a                               ....

6.  cmp 命令

cmp 是比较命令,用于比较两段内存的数据是否相等,命令格式如下:
cmp [.b, .w, .l] addr1 addr2 count
cmp 命令同样可以以 .b .w .l 来指定操作格式, addr1 为第一段内存首地址, addr2 为第
二段内存首地址, count 为要比较的长度。

例如,我们使用 .l 格式来比较 0x80000000 0X80000100 两个地址数据是否相等,比较长度为 0x05 个内存块(0x05 * 4=20 个字节)。

比较如下:

=> cmp.l 80000000 80000100 5
Total of 5 word(s) were the same

说明 0x80000000地址 与以 0x80000100地址开始的 20个字节的数据是相等的。

比较 0x80000000 和 0X80000200  地址的数据,比较长度为 0x05 个内存块(0x05 * 4=20 个字节)。

操作如下:

=> cmp.l 80000000 80000200 5
word at 0x80000000 (0xa0a0a0a) != word at 0x80000200 (0xdd7c756f)
Total of 0 word(s) were the same

可以看出,这两个地址的数据不相等。

猜你喜欢

转载自blog.csdn.net/wojiaxiaohuang2014/article/details/131507205