常见的服务器故障情况之一是 DRAM 故障,有时甚至在使用 ECC 内存时也会出现这种情况。
memtest86+
是诊断 DRAM 问题最有用的工具之一。由于它在内存启动时自行加载,我一直在想它是否检查了加载到memtest86+
内存中的部分。memtest86+
分配的内存是否memtest86+
太小而无所谓,或者是否有可能memtest86+
因为无法测试 DRAM 所在的内存位置而错过 DRAM 中的缺陷?
答案1
显然,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 的影子,其他部分可能完全无法访问)。
答案2
不,memtest 无法测试自己的内存。不过,内存太小了(只有几 KB),所以这几乎无关紧要。编辑:这个说法是错误的,因为正如所选答案所述,memtest 可以动态地将自身重新定位到测试全部用户可寻址内存。
--
理论上,现代处理器可以在启动时将部分缓存配置为可编程内存,从中可以运行非常小的程序(如 memtest)没有完全不接触 DRAM。
但是,它是一个特定于模型的功能(需要 BIOS 支持),我不认为 memtest 正在使用它。