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