是否有可能在 RAM 模块有缺陷的情况下运行 Windows (7,x64)?更准确地说,是否有某种方法可以告诉 Windows 不要分配已知的错误地址或地址块?
对于 Linux,有坏RAM。Windows 是否有现成的实现?Windows 内核(NT 6.1)是否可行?也许是内核模式驱动程序?
答案1
鲍勃,你的问题分为三个部分。我将逐一回答。
运行 Windows 时内存不足
确实有可能在模块有缺陷的情况下运行 Windows 7。根据坏扇区的位置以及模块在 DIMM 组中的位置,只要 Windows 7 不尝试接触内存的坏部分,它就会像什么都没有一样运行。因此,理想情况下,您应该将有缺陷的模块尽可能远离 0 组。当然,如果这是您唯一的模块,那么您就没那么幸运了。
在 Windows 中阻止坏内存扇区
在 x86(32 位和 64 位)操作系统上,内存由内核管理。正如您所提到的,BadMem 能够阻止 Linux 中的坏内存扇区。它的工作原理是指示内核锁定您指定的内存地址。这有效地阻止了 Linux 在分配(和释放)内存时寻址这些地址。但为了做到这一点,BadMem 需要修补内核。BadMem 只不过是一个您在应用之前配置的内核补丁。
现在,在 Windows 上你没有这种能力。你无法修补内核。开发内核模式驱动程序也不会给你带来任何好处,因为 Windows 内核永远不会让你的驱动程序优先于其内存管理架构(这是可以理解的)。
因此,您无法以任何方式指示 Windows 不使用某些内存地址。唯一的办法就是让 Microsoft 专门针对您的情况修补内核。不太可能。
坏内存地址的传播
内存模块可能包含坏地址的原因并不多。归根结底,这一切都归结为生产线上的错误,假设它在进入您的计算机之前没有受到损坏。与硬盘驱动器相反,内存模块中没有可移动部件,这一点您很清楚。因此,坏扇区不会像硬盘扇区那样扩散。
然而,内存测试软件并非万无一失。它有可能(而且很常见)通过某些实际上为坏的地址。因此,随着越来越多的地址被发现为坏的,坏内存可能会给人“扩散”的印象。因此,像 BadMem 这样的工具暴露了它们的弱点,因为它们自然只能处理您指示它们处理的那些地址。
任何人都不可能对内存模块进行彻底的测试,找出所有坏的内存地址,然后锁定它们,最终得到一个“好”的内存模块。最简单的做法是将具有坏地址的模块视为完全有缺陷的模块,因此不值得信任。
这意味着,尽管 BadMem 是一个有吸引力的提议,但它实际上并不是解决坏内存问题的方案。更有可能的是,您最终还是会遇到操作系统尝试读取坏扇区并因停止错误而崩溃的情况。坏模块就是坏模块就是坏模块。
答案2
Windows BCD(启动配置数据)实际上有一个{badmemory}
对象。似乎 ECC 内存“预测会出现故障”的内存地址将在此处列出,并且不会被操作系统使用。
该{badmemory}
对象接受一个BadMemoryList
(BCD 类型0x1700000a
)元素,该元素是可以以十六进制形式输入的整数列表,以空格分隔。我猜可以手动将 memtest86 发现的错误内存地址插入到此元素中 - 但我尚未测试过这一点。显然,它接受“页框号”,即实际地址除以 4096。不幸的是,这些地址/PFN 可能与内存诊断报告的地址/PFN 不匹配。可以使用以下方法进行手动编辑:可视化 BCD 编辑器。
无论如何,应按照其他答案的指示更换有故障的内存条。这只是关于解决这个问题的可能方法(暂时?)的说明。
memtest86 Pro(非免费)可以为你生成正确的黑名单命令在其报告中。其他答案描述了手动执行此操作的过程。
答案3
我在配备 SoC 的平板电脑中遇到了 RAM 问题。内存已焊接或集成到 SoC 中,无法更换。
我在阿根廷,卖家在中国,考虑到运输成本和时间,寄送保修毫无意义。
我成功了几次。
传递损坏内存参数的关键是:
- memtest86 中的地址与 Windows 中使用的地址相匹配。
- 必须标记4KBytes的完整页面。
- 在 memtest 中
0x10000000
对应于 Windows 中的 0x10000 - 在 memtest 中
0x00001000
对应于 Windows 中的 0x1 - 意思是:windows里的页码去掉memtest的最后3位十六进制数。
- 意思是:windows会消除左边的零。
- 考虑5和6,以避免页码出现错误。
- 正确的表述是:
bcdedit /set {badmemory} badmemorylist 0xB7 0xB8 0xB9 0xBA
memtest 中的错误从 0x000B7000 到 0x000BAFFF。请注意,您不能放置一个范围的内存,而是将所有页面逐一放置 - 无法添加页面,所有页面都应使用相同的命令进行标记。如果添加新页面,则添加的页面将覆盖旧页面。我设法仅使用一个命令就添加了 4096 个页面。我还没有尝试更多。
bcdedit /enum {badmemory}
,显示标记页面的列表。bcdedit /set badmemoryaccess no
防止使用标记的页面- 标记页面并删除访问权限后需要重新启动。
答案4
看看这个实用程序:https://github.com/prsyahmi/BadMemory
它非常易于使用,并支持阻止地址范围。并且您可以使用从 MemTest86 收到的完整地址,而无需删除最后三位数字。