运行带有缺陷 RAM 的 Windows

Bob*_*Bob 29 memory windows-7 hardware-failure

是否可以使用有缺陷的 RAM 模块运行 Windows(7、x64)?更准确地说,有没有办法告诉 Windows 不要分配已知的错误地址或地址块?

对于 Linux,有BadRAM。是否有适用于 Windows 的现有实现?Windows的内核(NT 6.1)甚至可以做到吗?也许是内核模式驱动程序?

Bob*_*Bob 20

Windows BCD(引导配置数据)实际上有一个{badmemory}对象。似乎 ECC 内存“预测失败”的内存地址将在此处列出,而不会被操作系统使用。

{badmemory}对象接受一个BadMemoryList(BCD 类型0x1700000a)元素,它是一个整数列表,可以输入为十六进制,以空格分隔。我想可以将 memtest86 发现的坏内存地址手动插入到该元素中 - 但我还没有测试过。显然,它接受“页帧号”,即实际地址除以 4096。不幸的是,这些地址/PFN 可能与内存诊断报告的地址/PFN 不匹配。可以使用Visual BCD Editor进行手动编辑。

在任何情况下,都应按照其他答案的指示更换有故障的记忆棒。这只是关于解决该问题的可能方法的说明(暂时?)。


jgu*_*avo 15

我在带有 SoC 的平板电脑中遇到了 RAM 问题。内存焊接或集成到 SoC 中,无法更换。

我在阿根廷,卖家在中国,运费和时间,寄保修也没意义。

我成功了几次。

传递损坏的内存参数的关键是:

  1. memtest86 中的地址匹配 Windows 中使用的地址。
  2. 必须标记 4KB 的整页。
  3. 在 memtest 中0x10000000对应于 Windows 中的 0x10000
  4. 在 memtest 中0x00001000对应于 Windows 中的 0x1
  5. 意思是:windows 中的页码去掉了最后 3 个 memtest 的十六进制数。
  6. 意味着:windows 消除了左边的零。
  7. 考虑 5 和 6,以避免页码错误。
  8. 正确的说法是:bcdedit /set {badmemory} badmemorylist 0xB7 0xB8 0xB9 0xBAmemtest 中的错误从 0x000B7000 到 0x000BAFFF。注意不能放一个范围的回忆,而是把所有的页面一个一个
  9. 不能添加页面,所有页面都应该在同一个命令中标记。如果是新页面,添加覆盖旧页面。我设法在一个命令中添加了 4096 页。我没有试过更多。
  10. bcdedit /enum {badmemory}, 显示标记页面的列表。
  11. bcdedit /set badmemoryaccess no 防止使用标记的页面
  12. 标记页面并删除访问权限后需要重新启动。

  • 我必须删除“/”和命令之间的空白才能使其正常工作,因此与其他命令相同的“bcdedit / enum {badmemory}”将是“bcdedit / enum {badmemory}”,而不是“bcdedit / enum {badmemory}” (2认同)

san*_*ier 14

Windows BCD 有{badmemorylist}{badmemoryaccess}对象。您应该将第一个 ( {badmemorylist})设置为由空格分隔的坏内存页(例如bcdedit /set badmemorylist 1499543 1434007),将第二个 ( {badmemoryaccess}) 设置为No( bcdedit /set badmemoryaccess No)

请记住,Windows 中的内存页大小通常为 4KB

在 windows 7 中测试过,效果很好

您可以使用Rammaputil(由 Sysinternals 提供)测试您的设置

PS我从 "Windows Internals Book" chapter 10


A D*_*arf 13

鲍勃,你的问题分为三个部分。我将一次解决一个问题。

运行内存不佳的 Windows

确实可以使用有缺陷的模块运行 Windows 7。根据坏扇区的位置以及模块在 DIMM 组中的位置,只要不尝试接触内存的坏部分,Windows 7 就会像什么都没有一样运行。因此,理想情况下,您应该将有缺陷的模块尽可能远离 bank 0。当然,如果这是您唯一的模块,那您就不走运了。

阻止 Windows 中的坏内存扇区

在 x86(32 位和 64 位)操作系统上,内存由内核管理。正如您所提到的,BadMem 能够阻止 Linux 中的坏内存扇区。它的工作原理是指示内核锁定您指定的那些内存地址。这有效地阻止了 Linux 在分配(和释放)内存时寻址这些地址。但是为了做到这一点,BadMem 需要修补内核。BadMem 只不过是您在应用之前配置的内核补丁。

现在,您在 Windows 上没有这种能力。您无法修补内核。开发内核模式驱动程序也不会给您带来任何好处,因为 Windows 内核永远不会让您的驱动程序优先于其内存管理架构(可以理解)。

因此,您不能以任何方式指示窗口不使用某些内存地址。唯一的方法是让 Microsoft 专门针对您的情况修补内核。不太可能。

坏内存地址的传播

内存模块可能包含错误地址的原因并不多。最终这一切都归结为生产线中的错误,假设它在进入您的计算机之前没有受到损坏。众所周知,与硬盘驱动器不同的是,内存模块中没有可移动部件。因此,坏扇区不会像硬盘驱动器扇区那样扩散。

然而,内存测试软件并非万无一失。它有可能(并且很常见)通过某些实际上很糟糕的地址。因此,随着越来越多的地址被发现是坏的,坏内存可能会给人一种“传播”的印象。出于这个原因,像 BadMem 这样的工具暴露了它们的弱点,因为它们自然只能处理你指示它们处理的那些地址。

任何人都不太可能对内存模块进行彻底的测试并识别所有坏的内存地址,然后将它们锁定并最终得到一个“好”的内存模块。最简单的做法是将地址错误的模块视为有缺陷的模块,因此不值得信任。

这意味着,尽管 BadMem 是一个有吸引力的提议,但它实际上并不是解决记忆力差问题的方法。更有可能的是,您最终仍会得到一个尝试读取坏扇区并因停止错误而崩溃的操作系统。坏模块就是坏模块就是坏模块。

  • 不太正确;它 * 是 * 可能指示 Windows 避免某些地址(更准确地说,某些页框编号)。该功能是为 ECC 内存设计的,Windows 可以使用它检测可能的故障并将这些 PFN 标记为错误,但可以手动将 PFN 添加到列表中:http://superuser.com/a/490522/117590 - 只是不是非常实用。所以,是的,更换仍然是最好的选择:P (9认同)

小智 5

看看这个实用程序: https: //github.com/prsyahmi/BadMemory

它非常易于使用并且支持地址范围的阻止。您可以使用从 MemTest86 收到的完整地址,而无需删除最后三位数字。