常见的服务器故障情况之一是坏的DRAM,有时甚至在使用ECC内存时也是如此。
memtest86+
是诊断DRAM问题最有用的工具之一。 由于它在内存开始时自动加载,我一直在怀疑memtest86+
是否检查memtest86+
加载的内存部分。
内存分配到memtest86+
这么小,没关系, memtest86+
可能会错过DRAM的缺陷,因为它不能testing它驻留的内存位置?
显然,memtest86 +不能testing当前包含memtest86 +可执行代码的内存区域(但是如果在该区域有内存错误,testing本身很可能会崩溃)。 然而,memtest86 +能够在运行时将自己的代码重新定位到不同的地址,通过使用这个技巧,它可以testing固件(BIOS)允许使用的所有内存 – 不是一次全部。
该代码重定位在memtest86 +源代码归档文件中的README.background中进行了描述(该文件略有过时 – 例如,它指出用于memtest86 +代码的地址是0x2000和0x200000,但是源中定义的低地址是实际上是0x10000,高地址是0x2000000或0x300000,取决于机器的内存量)。
但即使有这个重定位技巧,memtest86 +也无法testing所有的内存,原因如下:
通常,固件(BIOS)为其自身使用保留一些RAM区域(例如,ACPI表格)。 虽然这些RAM区域可以被CPU访问,但是写入任何东西都会导致不可预知的行为。
RAM的某些部分用于系统pipe理模式 ,甚至不能从特权SMM代码之外的CPU访问。
RAM地址范围在640K和1M之间,由于遗留的PC内存布局不可访问(有些RAM可能被用作BIOS ROM和SMM的影子,其他部分可能完全无法访问)。
不,memtest不能testing自己的内存。 但是,它是如此之小(只有一些KB),它几乎没有关系。 编辑:这种说法是错误的,因为,如所选答案中所述,memtest可以dynamic地重新定位自己来testing所有用户可寻址的内存。
–
理论上,现代处理器可以在启动时将其caching的一部分configuration为可编程内存,从非常小的程序(作为memtest)可以在完全不接触DRAM的情况下运行。
但是,这是一个特定于模型的function(需要BIOS支持),我不认为memtest正在使用它。