一. 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
可以看出,这两个地址的数据不相等。