作者littleshan (我要加入剑道社!)
看板ask-why
标题Re: [请益] 用软体测试RAM是否有没有毁损的原理是??
时间Fri Nov 13 18:48:25 2009
http://www.memtest86.com/tech.html#philo
记忆体的错误可能分成 hard memory fail 以及 intermittent memory error,
前者是单纯的写入後会读出错误的内容,後者则是当你写入资料时,相临的
memory cell 也「不小心」被同样的资料盖过去。
第一种错误是很容易检查的:就一个回圈一一检查每个记忆体位址在写入後是
否能读回正确的值即可,当然这支程式本身要能够直接存取 physical memory。
第二种错误则需要一些特别方式,memtest86 的网页中提出了 moving inversion
这个方法:
1. 把所有记忆体的内容写为某个值 x
2. 从低位址开始,一一确认所有记忆体位址内的值为 x
然後把该位址的内容改为 x 的补数
3. 从高位址开始,一一确认所有记忆体位址内的值为 x 的补数
然後把该位址的内容改为 x
这个方法在大部份的情况下可以找到 intermittent memory error,不过需要注
意的是现代的 CPU 都有 cache 的设计,记忆体本身也有一块 buffer 以加速存
取速度,这些设计很可能让上面的测试程序找不到错误。以下面的例子来说:
1. 假设目前已执行完第一步,记忆体所有内容皆为 x
2. 从低位址 0x0001 开始检查内容是否正确,然而因为 CPU 的 cache 设计,
0x0001 ~ 0x000F 的内容会被抓进 cache memory 中,它们的内容都是 x
3. 把 0x0001 写入新的资料,这笔资料可能因为 intermittent error 而造成
0x0002 的内容损毁,但不幸的是,因为 CPU cache 中仍拥有正确的值,
这个错误无法被检查出来。
为了克服 cache 和 buffer 造成的问题,下面是另一项作法
1. 对於所有的记忆体位址,每隔 20 byte 就填入 x
2. 把其它内容填为 x 的补数
3. 重覆以上两步骤多次
4. 读取整段记忆体,检查 x 是否每隔 20 byte 就出现一次
5. 重覆以上四步骤 20 次,直到所有的记忆体位置都有曾被填为 x
由於这个方法会先把整块记忆体都填入资料再进行检查,因此可以确保 cache
或 buffer 内的资料会先写回到记忆体中,因此後面的检查步骤可以找出写入
记忆体时发生的错误。
当然,记忆体可能会有 hard error 或 intermittent error 以外的错误情况,
但上面的演算法应该可以侦测到大部份的记忆体错误。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.29.108