有很多测试内存的软件。但是,许多测试只是将一些模式套用到内存上,而没有对内存体系结构或如何最好地检测错误进行深入思考或了解。这对于硬盘故障很有效,但很少发现间歇性错误。基于 BIOS 的内存测试对于查找间歇性内存错误毫无用处。
存储芯片由大量紧密堆积的存储单元组成,每位数据一个。绝大多数间歇性故障是这些存储单元之间相互作用的结果。通常,写入存储单元会导致相邻单元之一被写入相同的数据。有效的内存测试将尝试测试这种情况。因此,测试内存的理想策略如下:
用零写一个单元格
一次,一次或多次写入所有相邻的单元格
检查第一个单元格是否仍为零
很明显,这种策略需要对存储单元在芯片上的布局有确切的了解。另外,针对不同芯片类型和制造商的芯片布局的数量是无止境的,这使得该策略不切实际。但是,有些测试算法可以达到理想状态。
MemTest86测试算法
MemTest86使用两种算法,可以合理地近似上述理想的测试策略。这些策略中的第一个称为移动反演。移动反演测试的工作方式如下:
用模式填充内存
从最低地址开始
检查图案没有改变
写出图案补全
增加地址
重复
从最高地址开始
检查图案没有改变
写出图案补全
递减地址
重复
该算法非常适合理想的内存测试,但是存在一些限制。今天,大多数高密度芯片都存储4至16位宽的数据。对于超过一位宽的芯片,不可能仅选择性地读取或写入一位。这意味着我们不能保证已经测试了所有相邻单元格的相互作用。在这种情况下,我们能做的最好的事情就是使用一些模式来确保所有相邻单元至少已被写入所有可能的一和零组合。
还可以看到,缓存,缓冲和乱序执行将干扰移动反演算法,并降低效率。可以关闭高速缓存,但是不能禁用新的高性能芯片中的内存缓冲。为了解决这个限制,我创建了一种新的算法Modulo-X。此算法不受缓存或缓冲的影响。该算法的工作原理如下:
对于0-20的起始偏移量
每20个位置写一个图案
用模式补写其他所有位置
重复一次以上
每20个位置检查一次图案
该算法完成与移动反转几乎相同级别的邻接测试,但不受缓存或缓冲的影响。由于对所有内存执行了单独的写遍(1a,1b)和读遍(1c),因此我们可以确保所有缓冲区和缓存在遍之间都已刷新。选择20作为步幅大小有些随意。较大的步幅可能更有效,但执行时间会更长。选择20似乎是速度和彻底性之间的合理折衷。
个别测试说明
MemTest86执行一系列编号的测试部分以检查错误。这些测试部分包含测试算法,数据模式和缓存设置的组合。安排了这些测试的执行顺序,以便尽快发现错误。
每个测试部分的说明如下:
测试0 [地址测试,步行测试,无