memtest86 +是否测试用于自身运行的内存?


65

常见的服务器故障情况之一是DRAM损坏,有时甚至使用ECC内存也是如此。

memtest86+是诊断DRAM问题的最有用的工具之一。当它在内存的开头加载自身时,我一直想知道是否memtest86+检查内存中memtest86+已加载的部分。

分配给的内存是否memtest86+小到都没关系,还是memtest86+由于无法测试其所在的内存位置而可能错过DRAM中的缺陷?


8
尽管此问题与服务器相关,但与普通PC也相关,所以我投票决定将这个问题移至“ 超级用户”,以便可以吸引更多人。
Cristian Ciupitu

Answers:


78

显然,memtest86 +无法测试当前包含memtest86 +可执行代码的内存区域(但是,如果该区域中存在内存错误,则测试本身很可能崩溃)。但是,memtest86 +能够在运行时将其自己的代码重定位到其他地址,通过使用此技巧,它可以测试固件(BIOS)允许使用的所有内存-并非一次即可。

此代码重定位在memtest86 +源代码存档内的README.background中进行了描述(文件已过时-例如,它指出用于memtest86 +代码的地址为0x2000和0x200000,但源中定义的低地址为实际为0x10000,高位地址为0x2000000或0x300000,具体取决于计算机中的内存量)。

但是即使有这种重定位技巧,由于以下原因,memtest86 +也无法测试所有内存:

  • 通常,固件(BIOS)保留一些RAM区域供自己使用(例如ACPI表)。尽管这些RAM区域可以由CPU访问,但是将任何内容写入其中都可能导致无法预料的行为。

  • RAM的某些部分用于系统管理模式,特权SMM代码之外的CPU甚至无法访问。

  • 由于旧版PC内存布局的古怪之处,无法访问640K和1M之间的RAM地址范围(某些RAM可能用作BIOS ROM和SMM的影子,其他部分可能完全无法访问)。


1
有趣的是,我错过了它的重定位功能。显然,SMM等超出了范围(除了特定的BIOS支持)。
shodanshok '16

那些映射区域通常排除DRAM,因为正在解决其他“模块外”问题?ROM和外围设备说。
mckenzm '16

3
如果您有几个ram模块,请在交换它们之后执行第二次测试...
JFL 2016年

由于重写了指令,内存是否可能以正确的方式失败以使memtest错误地报告成功?或更确切地说,这需要多少错误?
John Dvorak

3
@JanDvorak:从理论上讲,这是可能的。在实践中,我想说的只是比敲击键盘上的头部和随机输入莎士比亚十四行诗的可能性要大。
Ilmari Karonen

5

不,memtest无法测试其自身的内存。但是,它很小(只有几KB),所以几乎没有关系。编辑:此语句是错误的,因为如所选答案中所述,memtest可以动态重定位自身以测试所有用户可寻址内存。

-

从理论上讲,现代处理器可以在启动时从很小的程序(如memtest)中将部分高速缓存配置为可编程存储器,而完全不接触DRAM。

但是,它是特定于模型的功能(需要BIOS支持),我认为memtest没有使用它。


谢谢您的回答。memtest正在测试CPU缓存。因此,如果memtest将其加载到此缓存中,则无法测试缓存的这一部分,这更成问题了,因为它比内存小得多?
罗宾

2
由于存在于memtest86文档中,它至少在直接方式中测试处理器缓存。此外,现代处理器具有单独的指令和数据缓存(I $和D $)。可执行代码已加载到指令缓存中,无法直接修改/覆盖
-shodanshok

1
memtest86 +绝对可以测试CPU数据缓存,但这对这个问题无关紧要。再次感谢您的回答。
罗宾

3
你确定吗?我以为它会在测试它通常存在的内存时将自己复制到其他地方。这就是为什么每个测试都有一个很慢的部分(大部分内存)和一个非常快的部分(存储代码/数据的一小部分)的原因。
彼得·科德斯

1
@DmitryGrigoryev:好的,所以我学到了更多的知识:-)谢谢!
罗宾
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.