memtest86+ 是否测试用于运行自身的内存?

Rob*_*bin 65 linux memory boot

常见的服务器故障之一是 DRAM 损坏,有时甚至在使用 ECC 内存时也是如此。

memtest86+是诊断 DRAM 问题最有用的工具之一。当它在内存开始时加载自己时,我一直想知道是否memtest86+检查memtest86+加载到的内存部分。

分配给的内存是否memtest86+太小以至于无关紧要,或者是否有可能memtest86+因为 DRAM 无法测试它所在的内存位置而错过 DRAM 中的缺陷?

Ser*_*sov 77

显然,memtest86+无法测试当前包含memtest86+可执行代码的内存区域(但如果该区域存在内存错误,则测试本身很可能会崩溃)。然而,memtest86+ 能够在运行时将自己的代码重新定位到不同的地址,并且通过使用这个技巧,它能够测试固件 (BIOS) 允许使用的所有内存 - 只是不是一次全部。

此代码重定位在 memtest86+ 源代码存档内的 README.background 中进行了描述(该文件有点过时——例如,它指出用于 memtest86+ 代码的地址是 0x2000 和 0x200000,但源中定义的低地址是实际上是 0x10000,高地址是 0x2000000 或 0x300000,具体取决于机器中的内存量)。

但即使使用这种重定位技巧 memtest86+ 也无法测试所有内存,原因如下:

  • 通常,固件 (BIOS) 会保留一些 RAM 区域供自己使用(例如,ACPI 表)。虽然 CPU 可以访问这些 RAM 区域,但向其中写入任何内容都可能导致不可预测的行为。

  • RAM 的某些部分用于系统管理模式,甚至无法从特权 SMM 代码之外的 CPU 访问。

  • 由于传统 PC 内存布局的怪癖,640K 和 1M 之间的 RAM 地址范围无法访问(其中一些 RAM 可能用作 BIOS ROM 和 SMM 的影子,其他部分可能完全无法访问)。

  • 如果您有多个 ram 模块,请在交换它们后执行第二次测试... (3认同)
  • @JanDvorak:理论上,当然有可能。在实践中,我会说这只是比用头敲击键盘并随机输入莎士比亚十四行诗的可能性稍大一些。 (3认同)

sho*_*hok 5

不,memtest 不能测试自己的内存。然而,它太小了(只有几 KB),几乎没有关系。编辑:此语句是错误的,因为如所选答案中所述, memtest 可以动态重新定位自身以测试所有用户可寻址内存。

——

理论上,现代处理器可以在启动时将其缓存的一部分配置为可编程内存,从非常小的程序(如 memtest)中可以运行,根本不需要接触 DRAM。

但是,这是一个特定于模型的功能(需要 BIOS 支持),我认为 memtest 没有使用它。

  • 你确定吗?我认为它在测试它通常所在的内存时将自己复制到其他地方。这就是为什么每个测试都有一个缓慢的部分(大部分内存)和一个非常快的部分(存储其代码/数据的一小部分)。 (3认同)
  • 基于 [memtest86 文档](http://www.memtest86.com/technical.htm),它 ** 不** 测试处理器缓存,至少以直接方式测试。此外,现代处理器具有独立的指令和数据缓存(I$ 和 D$)。可执行代码加载到指令缓存中,不能直接修改/覆盖 (2认同)