Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1595923
  • 博文数量: 92
  • 博客积分: 2002
  • 博客等级: 大尉
  • 技术积分: 4717
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-01 17:09
文章分类

全部博文(92)

文章存档

2013年(1)

2012年(6)

2011年(85)

分类: LINUX

2011-10-28 15:51:20

在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多次

二、改uboot

linux可能正在使用那块内存,你写的话当然出错
不让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) |
给主人留下些什么吧!~~