微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux – 如何在Arm Architecture硬件上进行内存测试? (像Memtest86这样)

有没有办法在 Android设备RAM上进行完整的内存测试?

我正在开发一个驱动程序,但在ramdom时间,我得到某些具有错误值的物理地址,导致驱动程序进入错误状态.当我遇到问题时,我正试图从RAM读取.我认为我设备上某些部分的ram已损坏.

解决方法

完整是一个含糊不清的词.它可能意味着不同的温度,电压以及具有不同元件容差的一系列器件.当你站点MemTest86时,我想我明白了.我见过的大多数项目都是基于C的,无法测试所有内容.

这是在Linux-http://www.madsgroup.org/~quintela/memtest/下运行的一个

有记录的算法,如行走位等.很大程度上取决于你的RAM类型.我想你有某种类型的SDRAM. SDRAM有许多不同的周期.有单拍读/写,银行到银行转移,终止突发等.

就个人而言,我们有一个系统,当通过以太网(DMA)进行SSH传输时,5%的电路板会出现问题. SSH涉及加密,这是cpu /内存密集型,DMA引擎通常执行与cpu(带缓存)不同的SDRAM周期.

这是一些要求,

>用于驻留代码的非SDRAM内存.
>裸金属框架(无缓存,中断,DMA等)
>关闭DCache.
>打开代码的ICache.

一个限制要求是运行时间.完整的SDRAM测试可能需要数年才能在单板上运行.我发现伪随机地址/数据测试效果很好.只需获取与SDRAM大小相关的数字,并将其用作增量.最简单的情况是1.您可能希望找到其他人不断更改行,库和设备大小;银行规模-1例如;然而素数会更好,因为你有不同的位数一直在变化.关闭缓存后,您可以使用char,short,int和long long指针来测试一些不同的突发长度.这些测试会很慢.您将需要使用ldm / stm对来模拟完整的SDRAM突发,这些更常见于缓存,因此您应该使用ldm / stm来模拟它们.这也是最快的测试之一.

typedef unsigned char      b8;
typedef unsigned short     b16;
typedef unsigned long      b32;
typedef unsigned long long b64;

/* Use a macro to speed code.  The compiler will use constants for
 * _incr and _wrap instead of registers which cause spilling.  A
 * macro centralizes the memory test logic.
 */
#define MEMTEST(name,type,_incr,_wrap) ...

/* Sequential tests. */
MEMTEST(do_mem_seq8,b8,97,1)
MEMTEST(do_mem_seq16,b16,50839,1)
MEMTEST(do_mem_seq32,b32,3999971,1)
MEMTEST(do_mem_seq64,b64,1)

/* Random tests. These test try to randomize both the data and the
 * address access.
 */

/* 97/0x61 prime for char and 9999991/0x989677 prime for 64MB. */
MEMTEST(do_mem_rnd8,9999991)
/* 50839/C697 large prime for 64k and 9999991/0x989677 prime for 64MB. */
MEMTEST(do_mem_rnd16,9999991)
/* 3999971/3D08E3 prime and 9999991/0x989677 prime for 64MB. */
MEMTEST(do_mem_rnd32,9999991)
/* 3999971/3D08E3 prime and 9999991/0x989677 prime for 64MB. */
MEMTEST(do_mem_rnd64,9999991)

incr是数据增量,wrap是地址增量.突发的算法将是相同的.这是一些内联gcc汇编程序,

register ulong t1 asm ("r0")  = 0;                              \
    register ulong t2 asm ("r4")  = t1 + incr;                      \
    register ulong t3 asm ("r6")  = t2 + incr;                      \
    register ulong t4 asm ("r8")  = t3 + incr;                      \
        /* Run an entire burst line. */                             \
        __asm__ (" stmia  %[ptr],{%0,%1,%2,%3}\r\n" : :            \
                 "r" (t1),"r" (t2),"r" (t3),"r" (t4),\
                 [ptr]"r" (start + (addr<<2)) :                     \
                 "memory" );                                        \
        /* Read four 32 bits values. */                             \
        __asm__ (" ldmia   %[ptr],%3}\r\n" :          \
                 "=r" (t1),"=r" (t2),"=r" (t3),"=r" (t4) :       \
                 [ptr]"r" (start + (addr<<2)) );                    \

这些测试很简单,应该适合代码缓存,这将最大限度地增加RAM的压力.我们的主要问题是DQS延迟,这对DDR-SDRAM至关重要,可能与温度和电压有关,并且会随PCB布局和材料而变化.

如果要使用SDRAM芯片优化存储器控制器寄存器,则可以使用Cachbench.它也可能对测试有用.

另请参阅:Unix Stack Exchange (same question).我在Linux下使用了这些基于C的测试套件,但它们在我们的案例中没有暴露任何问题.对于上面描述的内容,memtest86 algorithms可能没有压力(对于PCB故障);虽然测试7或burnBX测试很接近.我认为memtest86可以解决DRAM芯片问题,而不是电路板设计问题.

编辑:另一个问题是与SDRAM芯片的瞬态/串扰.如果您的设备驱动程序是高电流或高频设备,SDRAM接口可能会发生串扰,或者由于电源变化而获得双时钟.因此RAM测试可能没有问题,SDRAM错误仅在使用特定硬件部分时发生.另外请注意,Android设备不使用动态时钟并更改SDRAM频率.当时钟改变时,信号可以穿过共振.

原文地址:https://www.jb51.cc/linux/394854.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐