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

时间:2012-07-24 22:09:12

标签: linux arm

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

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

3 个答案:

答案 0 :(得分:7)

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

这是在 Linux - http://www.madsgroup.org/~quintela/memtest/

下运行的

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

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

以下是一些要求,

  1. 用于驻留代码的非SDRAM内存。
  2. 裸金属框架(无缓存,中断,DMA等)
  3. 关闭DCache。
  4. 打开代码的ICache。
  5. 另一个限制要求是 time 运行。 完整的 SDRAM测试可能需要数年才能在单板上运行。我发现伪随机地址/数据测试效果很好。只需获取与SDRAM大小相关的数字,并将其用作增量。最简单的情况是1。您可能希望找到其他人不断更改rowsbanks和设备大小;例如bank size-1;然而素数会更好,因为你有不同的位数一直在变化。关闭缓存后,您可以使用charshortintlong long指针来测试一些不同的突发长度。这些测试会很慢。您需要使用ldm/stm对来模拟完整的 SDRAM突发,这些更常见于缓存,因此您应该使用{{1}模拟它们}。这也是最快的测试之一。

    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, 3999971, 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,b8,97,9999991)
    /* 50839/C697 large prime for 64k and 9999991/0x989677 prime for 64MB. */
    MEMTEST(do_mem_rnd16,b16,50839,9999991)
    /* 3999971/3D08E3 prime and 9999991/0x989677 prime for 64MB. */
    MEMTEST(do_mem_rnd32,b32,3999971,9999991)
    /* 3999971/3D08E3 prime and 9999991/0x989677 prime for 64MB. */
    MEMTEST(do_mem_rnd64,b64,3999971,9999991)
    

    ldm/stm是数据增量,incr是地址增量。 burst 的算法将是相同的。这是一些内联gcc汇编程序

    wrap

    这些测试很简单,应该适合代码缓存,这将最大限度地增加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频率。随着时钟的变化,信号可能会超过共振。

答案 1 :(得分:2)

Das U-Boot可能是ARM板上使用最广泛的引导加载程序,它包含一些内存测试功能。

有趣的是,其README提出了另一种方法,它可能更便携和/或更有效:

最强调这种系统的测试用例是,通过在NFS上安装了根文件系统来引导Linux,然后构建更大的系统 本机软件包(例如,在系统上编译Linux内核)- 这将导致足够的上下文切换,网络流量(以及从网络控制器进行的DMA传输),变化的RAM使用情况等,从而触发该区域的任何薄弱环节。

在构建linux内核时,您可能会对CONFIG_MEMTEST=y选项感兴趣,该选项将导致构建内置内存测试。这曾经只用于x86体系结构,但是我相信最新版本也可以在其他体系结构上支持它,甚至ARM。

memtester工具已经构建,并且可以在some linux distributions中用于各种体系结构,包括ARM。

kernel-memtest项目也可能使您感兴趣。

请记住,没有任何工具可以测试正在运行的内存(因此,正在运行的OS中的程序将存在明显的盲点),基本的读/写测试不会揭示每种类型的缺陷或其他错误。相应地设置您的期望,如果您有理由怀疑内存不好,请考虑尝试使用几种不同的测试工具。

答案 2 :(得分:0)

截至 2021 年 2 月,有一个基于 ARM 的 MemTest86 版本。 它与 x86 磁盘映像在同一个包中。

您需要一台带有 UEFI BIOS 的机器才能启动它。因此,它在大多数台式机和服务器级机器上都可以,但在没有内置 BIOS 的基于 ARM 的小型设备上则不行。