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