如何根据MemTest86+错误指示将正确的坏RAM扇区列入黑名单?

如何根据MemTest86+错误指示将正确的坏RAM扇区列入黑名单?

MemTest86+(Ubuntu 13.04 附带的版本)说

Failing address: 002f796c48 -    759.5 MB

我应该在memmap内核参数中指定什么来绕过这个区域?

我尝试运行memtester 770MB,它说一切正常,所以看起来 MemTest 的指示并不意味着从一开始第 759.5 MB 处就有错误。

如何解释这个 MemTest 指示配置memmap

我现在没有钱购买新的内存,而且错误似乎是单一的,所以我希望我可以覆盖它。

答案1

内存映射

有一个教程标题为:记性不好怎么办其中讨论使用内核参数通过内核禁用内存memmap。根据 Howto,您有 2 个选择memmap

  • 糟糕的记忆之后关掉一切——(mem=###M option)
  • 仅关闭坏内存周围的内存 -(memmap=#M$###M option)

使用第一个选项,如果 memtest 报告 600M 内存有问题,那么您可以从该点开始禁用 RAM,直到 RAM 结束:

 mem=595M

如果 802M 和 807M 的 RAM 出现问题,您可以禁用从 800M 开始的 10M 部分 RAM,如下所示:

memmap=10M$800M

笔记:这会将 800M 基地址之后的 10M 列入黑名单。你应该memtest86+事后运行来确认这个论点是正确的。

坏内存

Ubuntu 有一个名为 BadRam 的可用补丁。这篇文章中对此进行了很好的介绍,标题为:坏内存在 Ubuntu 社区网站上。

使用该页面中的详细信息将补丁应用到内核后,您可以对 Grub2 设置进行修改:

摘自该网站的 Grub2

Natty 中的 GRUB2 配置文件有一行用于配置内核坏内存排除。因此,我假设这是映射显示错误的内存部分的首选方法。我设置的线是

GRUB_BADRAM="0x7DDF0000,0xffffc000"

我能找到的每个网站上的建议方法都是运行 memtest86 并让它显示 BadRAM 设置。 memtest86 给了我一页我必须输入的内容。我可以看到所有地址都在一个 16K 块中,所以我只想映射该 16K 块以使其停止工作。这是我生成正确条目的方法。

第一个参数很简单。那是坏内存的基地址。就我而言,我可以看到所有错误地址都大于 0x7DDF0000 且小于 0x7DDF4000。所以,我把16K块的开头作为我的起始地址。

第二个参数是掩码。在您想要的地址范围共享相同值的地方输入 1,在不同的地址范围内输入 0。这意味着您需要选择地址范围,以便仅低位发生变化。看看我的地址,面具的第一部分很简单。您想以 0xffff 开头。对于下一个半字节,我将用位图进行解释。我想要的范围是从 0000 到 0011。因此,badram 的掩码将是 1100 或十六进制 c。掩码中的最后 3 个半字节需要全为 0,因为我们希望映射出整个范围。所以,我们得到的总结果是 0xffffc000。

在 /etc/default/grub 中设置此行后,我运行 sudo update-grub 并重新启动,我的坏内存不再被使用。使用此方法不需要内核补丁来映射坏内存。

跟进#1

查看 memtest86+ 的维基百科页面,其说明如下:

摘自Memtest86 维基百科页面

从 Memtest86 2.3 和 Memtest86+ 1.60 开始,程序可以按照 Linux 内核的 BadRAM 补丁所期望的格式输出坏 RAM 区域列表;使用此信息,Linux 系统可以可靠地使用 RAM 模块,即使它有一些坏位。 Grub2 能够向未打补丁的内核提供相同的信息,从而无需 BadRAM 补丁。

我也遇到过这个Gentoo 页面它指定memmap=...使用十六进制地址,因此您可以像这样指定它:

memmap=5M$0x2f796c48

5M 只是一个猜测,显然您可以根据您想要/需要省略的该区域周围的 RAM 量来调整它更低或更高。

最后,您还可以指定十六进制大小:

memmap=0x10000$0x2f796c48

将忽略从地址 0x2f796c48 开始的 64KB。

参考

答案2

Memtest86+(我用的是4.20)可以直接输出badram格式。

  1. 按“c”进入配置对话框 memtest 配置对话框

  2. 然后“4”代表“错误报告模式”

    memtest错误报告模式对话

  3. 然后“3”代表“BadRAM 模式”

输出将从单个测试失败的列表更改为一系列 badram= 行,每行都包含一个新的坏扇区。因为这些行会附加并合并相邻的段,所以您可以在一夜之间无头运行测试并使用最终的打印行(尽管如果您的亮度非常糟糕,那么不太准确的“围绕此点 5 兆”格式可能会短一些)。

最后结果:

Memtest86+ 显示 badram 输出

答案3

非常肮脏但非常好的解决方法:运行用户空间 memtester,等待它发现错误。例如,让它位于 0xfce2ea31 。

然后再次运行 memtester,但在该物理地址上,因此:

memtester -p 0xfce20000 64k 128

可以肯定的是,如果你牺牲的不仅仅是有问题的地址的页面,那就更好了。这里我们牺牲了错误地址周围的 64kByte。

如果一切顺利,它将再次更快地找到错误的内存位置。

然后使用 ctrl/z 暂停 memtester 进程。

结果:在memtester进程被挂起之前,它不会带走更多的资源,但没有其他进程能够访问有故障的内存。因为它将由memtester分配。

在大型远程服务器上特别有用。挂起的进程可以一直保留到新 RAM 未发货为止。或者也许直到下一个圣诞节,那时停机就不再是大问题了。

答案4

从 Linux 2.6 开始,您可以使用 CONFIG_MEMTEST=y 构建内核

在内核命令行上使用“memtest”启动后,每次启动时都会对系统 RAM 进行快速测试,并自动排除明显的坏点。

这不会捕获所有内容,因为 memtest86 更加彻底并运行多次传递,但它可能在大多数情况下都有效,并且具有在丢失另外几个扇区时不需要手动干预的优点。

相关内容