有没有办法在Android设备RAM上进行完整的内存测试?
我正在开发一个驱动程序,但在ramdom时间我得到某些物理地址错误值导致驱动程序进入错误状态。当我遇到问题时,我正试图从RAM读取。我认为我设备上某些部分的ram已损坏。
答案 0 :(得分:7)
完整是一个含糊不清的词。它可能意味着不同的温度,电压以及具有不同元件容差的一系列器件。当你站点 MemTest86 时,我想我明白了。我见过的大多数项目都是基于 C 的,无法测试所有内容。
这是在 Linux - http://www.madsgroup.org/~quintela/memtest/
下运行的有记录的算法,例如行走位等。很大程度上取决于你的RAM类型。我猜你有某种类型的SDRAM。 SDRAM有许多不同的周期。有单拍读/写,银行到银行转移,终止突发等。
就个人而言,我们有一个系统,当通过以太网(DMA)进行SSH传输时,5%的主板会出现问题。 SSH涉及加密,这是CPU /内存密集型,DMA引擎通常执行与CPU(带缓存)不同的SDRAM周期。
以下是一些要求,
另一个限制要求是 time 运行。 完整的 SDRAM测试可能需要数年才能在单板上运行。我发现伪随机地址/数据测试效果很好。只需获取与SDRAM大小相关的数字,并将其用作增量。最简单的情况是1
。您可能希望找到其他人不断更改rows
,banks
和设备大小;例如bank size-1
;然而素数会更好,因为你有不同的位数一直在变化。关闭缓存后,您可以使用char
,short
,int
和long 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 的小型设备上则不行。