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

Iva*_*van 32 linux kernel memory ram

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

Failing address: 002f796c48 -    759.5 MB
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

slm*_*slm 30

内存映射

有一个标题为:Bad Memory HowTo 的教程,它讨论了使用内核memmap参数通过内核禁用内存。根据 howto,您有 2 个选择memmap

  • 记性不好后关掉一切—— (mem=###M option)
  • 只关掉坏记忆周围的记忆—— (memmap=#M$###M option)

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

 mem=595M
Run Code Online (Sandbox Code Playgroud)

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

memmap=10M$800M
Run Code Online (Sandbox Code Playgroud)

注意:这会将 800M 基地址之后的 10M 列入黑名单。您应该memtest86+稍后运行以确认此参数是正确的。

坏内存

有一个可用于 Ubuntu 的补丁,称为 BadRam。在这篇题为:Ubuntu 社区站点上的BadRAM 的帖子中,它在这里得到了很好的介绍。

使用该页面中的详细信息将补丁应用到内核后,您可以修改 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
Run Code Online (Sandbox Code Playgroud)

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

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

memmap=0x10000$0x2f796c48
Run Code Online (Sandbox Code Playgroud)

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

参考


sko*_*rgu 15

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

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

  2. 然后是“错误报告模式”的“4”

    memtest 错误报告模式对话

  3. 然后是“BadRAM 模式”的“3”

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

最后结果:

Memtest86+ 显示 badram 输出

  • 我所做的是拍下它的照片(相机手机),将其加载到 GIMP,=> 灰度 => 反转 => 对比度/伽玛,然后将其交给`tesseract ${IMG} stdout` .. 然后验证并更正在插入 /etc/default/grub 之前的行......可能只需要直接手动输入它^^ (9认同)
  • 现在,如果我不必手动复制它,而是将它交给 GRUB 而不会重新输入错误,那将是非常棒的。 (5认同)
  • 绝对比手动操作更有趣 (4认同)

pet*_*erh 5

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

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

memtester -p 0xfce20000 64k 128
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

  • 除了这个技巧之外,您还可以使用 util-linux 中的“chmem”工具来告诉内核将特定内存范围脱机(将数据移动到其他地方,然后不再重用这些页面)。 (2认同)