Chinaunix

标题: 对arm做内存诊断 [打印本页]

作者: lanyushan123    时间: 2014-05-19 14:44
标题: 对arm做内存诊断
大师好啊各位,我想要对arm板子的物理内存进行读写操作,但是不知从何处下手,跪求指导!!
我最近琢磨着,是不是用 /dev/mem读 内存,但这不是我想要的对硬件物理内存的诊断测试,求大侠指导!!!!!
作者: humjb_1983    时间: 2014-05-19 19:35
memtest工具应该就可以了吧
作者: Tinnal    时间: 2014-05-19 21:50
回复 1# lanyushan123

我最近琢磨着,是不是用 /dev/mem读 内存,但这不是我想要的对硬件物理内存的诊断测试,求大侠指导!!!!!

说了半天,你究竟想怎么测????????
通过/dev/mem, 直接读取所有的内存,至于你想怎么去读写,不就是就程序的事情了吗!

你是不是不会用/dev/mem呀。给你个链接:
http://blog.csdn.net/zhanglei4214/article/details/6653568

自己要学会用谷哥、度娘。


   
作者: lanyushan123    时间: 2014-05-21 09:01
用/dev/mem读取的是系统的物理内存吧?如果是读写arm板子的绝对物理地址的内存是怎样做回复 3# Tinnal


   
作者: lanyushan123    时间: 2014-05-21 09:10
如果相对物理内存按为读、写,应该怎么做呢, mmap /dev/mem是把内存按文件读取的么回复 3# Tinnal


   
作者: humjb_1983    时间: 2014-05-21 09:22
你的目的是啥?是要做内存硬件测试?
作者: lanyushan123    时间: 2014-05-21 15:53
对的,而且需要在板子里有系统运行的情况下测试硬件回复 6# humjb_1983


   
作者: Tinnal    时间: 2014-05-21 20:12
回复 4# lanyushan123

是的,读的就是物理地址,用法不是之前给你一下参靠链接了吗。你想没有用心看实在不应该!

例子的mmap是这样的。
map_base = mmap(NULL, 0xff, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0x20000);
别人也写得很清楚含义:
上面的例子将起始地址0x20000(物理地址), 长度为0xff映射出来。 然后就可以像普通数组一样操作内存。

已经很清楚了呀。
映射出来的后,就是一个指针,可直接访问,不用调读写文件的接口,看别人的例子就没用读写接口呀。

另外于再补充两点:
1、这个方法不仅仅访问内存,还能访问芯片的外设,只要有物理地址的都能访问。
2、高版本的内核对内核的代码段和数据段有保护,可以这个区段会访问不了,如果想访问,可以把这个功能关了。


因此,总结:
1. 没有去百度!
2. 没有详细看给你的参考链接!

我表示不高兴{:2_174:} 。
  


   
作者: humjb_1983    时间: 2014-05-22 08:46
很多的内存问题,用简单的用例和算法是测不出来的,建议还是别自己写用例了,就用现成的memtest工具,其已经考虑了各种情况,并设置了复杂的测试算法,相信会比自己写的更有用。
作者: lanyushan123    时间: 2014-05-22 21:40
对硬件内存的测试不容易完成吗? 导师要求做的测试,想法是源于之前对单片机的硬件内存的测试,所以计划将诊断测试对象换成arm板子,在装有linux系统的条件下做内存的测试,这个课题行不通吗?跪求高手解答回复 9# humjb_1983


   
作者: humjb_1983    时间: 2014-05-23 08:42
lanyushan123 发表于 2014-05-22 21:40
对硬件内存的测试不容易完成吗? 导师要求做的测试,想法是源于之前对单片机的硬件内存的测试,所以计划将诊 ...

呵呵,原来是为了做课题。
我的意思是,如果实际使用的话,就基本没有必要自己实现一个这样的工具了,因为已经有现成可用的了,而且人家做得比较好。
如果只是单纯的做研究,那就另当别论了。内存测试其实是一项比较复杂的工作,不是简单的读写几下内存就可以的,还需要考虑一些硬件特性,比如相邻cell之间的关联性,如果要自己实现,建议参考一下memtest工具的实现方式,映像中其测试算法还是很复杂的。
另外,如果要在运行的Linux环境中进行内存测试,也是比较危险的,写的时候不能覆盖掉已经使用的内存(尤其是内核自己用的)。估计你们老板的意思,是要考验你对Linux中内存分布、使用情况的熟悉程度。多数情况下,内存测试还是在离线,或通过grub启动进行,在运行系统中进行测试还是比较困难的。
作者: lanyushan123    时间: 2014-05-26 14:02
大师莫生气,我仔细研读也调试了那段程序,我只是在想,我做的是硬件的诊断测试,类似于实时的意思,如果将/dev/mem按设备文件读取,其实是将内存保存成了文件然后读取其内容,但是诊断测试的话,我好像应该是要按位写入内存,经过一种算法之后看能否得到相应的结果,那么这样的话,是改变了内存的对吧,那这样会不会影响系统的正常运行呢,应该是肯定会影响吧?纠结于这个问题,望指点一二回复 8# Tinnal


   
作者: Tinnal    时间: 2014-05-26 21:53
回复 12# lanyushan123
如果你随意动了Linux管理的内存,那肯定有问题呀。这点humjb_1983跟你谈了。
因为/dev/mem是直接去访问内存的,不会先向内核申请。
同时,“其实是将内存保存成了文件然后读取其内容”, 你这句话理解错了,/dev/mem是直接操作内存的,没有“先保存成文件”的于法,这点不能怪你,你不了解Linux的文件系统。但观念要纠正过来。

一般,嵌入式系统或PC,内存的检查都在系统启动前完成(如BIOS或UBOOT阶段),因为哪时候内存跟本没什么人在用,不会冲突,你爱怎么写就怎么去写。系统启来后,如果你把内核已经使用了的内存改写了,问题就大了,而你在用户态没法知到内核究竟用了哪块。因此,比较方便的方法有:
1. 当然在UBOOT了去做罗。
2. 在启动内核时,通过MEM命令行,让内核只用一小块,其它给你留着,然后再通过/dev/mem接口去测试。当然,内存要够大。
3. 通过mmap建立匿名映射,然后去访问。内核此时会给你正式分配内存,就不会冲突了。


还有就是内存的检测算法问题,我估计单片机就只会写入0X55,0Xaa这类的数然后再读回来这类的算法,因为单片机基本上用的都是SRAM,比较简单。而PC或者嵌入式系统用的都是SDRAM或DDR,内存本身比SRAM复杂得多,错误的类型也因此多样。单片机的检测算法太简单了。

如果只是一个课题,哪你就建一个匿名映射,再按单片机的算法写写,把题结了你行了,国内的研究我也不寄予什么希望。
如果想真实的去用户,还是参考一个社区完善的项目吧。如Memtest86。

如对上文有什么不理解,请先百度再发问。


   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2