其中一个常见的服务器故障情况是坏DRAM,有时即使使用ECC内存也是如此.
memtest86是诊断DRAM问题最有用的工具之一.当它在内存开始时加载自身时,我一直想知道memtest86是否会检查内存中加载memtest86的部分.
分配给memtest86的内存是否小到无关紧要,或者memtest86是否可能错过DRAM中的缺陷,因为它无法测试它所在的内存位置?
解决方法
显然,memtest86无法测试当前包含memtest86可执行代码的内存区域(但如果该区域存在内存错误,则测试本身很可能会崩溃).但是,memtest86能够在运行时将自己的代码重定位到不同的地址,并且通过使用这个技巧,它能够测试固件(B
IOS)允许使用的所有内存 – 只是不能一次完成.
此代码重定位在memtest86源代码存档中的README.background中描述(文件稍微过时 – 例如,它指出用于memtest86代码的地址是0x2000和0x200000,但源中定义的低地址是实际上是0x10000,高地址是0x2000000或0x300000,具体取决于机器中的内存量).
但即使使用此重定位技巧,memtest86仍无法测试所有内存,原因如下:
>通常,固件(BIOS)保留一些RAM区域供自己使用(例如,ACPI表).虽然可以通过cpu访问这些RAM区域,但将任何内容写入其中都可能导致不可预测的行为.
>某些部分RAM用于System Management Mode,甚至无法从特权SMM代码之外的cpu访问.>由于传统PC内存布局的怪癖,因此无法访问640K和1M之间的RAM地址范围(某些RAM可能会用作BIOS ROM和SMM的阴影,其他部分可能完全无法访问).