memtest86 +testing内存是用来运行自己吗?

常见的服务器故障情况之一是坏的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正在使用它。