在uboot下测试物理内存,可以使用命令
mtest start_addr end_addr
在linux下怎么测物理内存呢?
--------------------------------- 开始动手测 --------------------------------------测试环境:linux + uboot + 2G内存,内存物理地址 (0x0 ~ 0x8000 0000)
一、ioremap最先想到的是编写内核模块,ioremap 内存条的物理地址,然后读写测试0x4000 0000
ioremap 10M 空间成功,但测试写时会出错 Oops... kernel access bad area
也就说一块地址,可以ioremap多次
二、改ubootlinux可能正在使用那块内存,你写的话当然出错
不让linux使用那块内存,最简单的实现办法,改uboot
gd->ram_size -= 1024*1024*1024; 这样uboot引导linux时,高端1G内存就会预留
ioremap 10M 空间成功,读写测试通过(先别高兴的太早)
ioreamp 1G 空间失败,说是size不够
三、实现mmap内核空间用1G虚拟地址,用户空间用3G虚拟地址
所以ioremap当然不能分出1G地址供你用(ioreamp的空间大小是有限制的)
一个物理地址,内核调用 ioremap得到一个1G内的虚拟地址,用来操作物理内存
应用层调用 mmap 得到一个3G内的虚拟地址,用来操作物理内存看此贴,共享内存大展身手了编写内核模块,实现mmap接口
编写应用程序,通过mmap系统调用得到1G物理内存的首地址,然后读写测试0x4000 0000,测试通过。
press reset按钮,进入uboot,md 40000000,里面存的果然是测试数据,验证通过
---------------------------------- 华丽的分割线 --------------------------------------
网上搜到一些ioremap大小限制的帖子:
这里面提到修改boot option的方法,即vmalloc=XXXM.
这种方法对于i386构架有效,而我的目标机是powerpc,不支持vmalloc参数(有兴趣看代码就知道了)
powerpc构架的解决办法:
1.vmalloc参数对应
需要打补丁,修改内核代码。搜索了一下,网上有补丁,不过本人没试过。
2.修改.config的CONFIG_KERNEL_START值,将vmalloc可用空间做大。(我上面说的)
缺点是用户可用物理内存变小。
#另外我还试了修改boot option,mem=XXXM的方法。预留高位内存,驱动中ioremap的方法,结果失败。
阅读(14382) | 评论(0) | 转发(3) |