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 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格式。
按“c”进入配置对话框
然后“4”代表“错误报告模式”
然后“3”代表“BadRAM 模式”
输出将从单个测试失败的列表更改为一系列 badram= 行,每行都包含一个新的坏扇区。因为这些行会附加并合并相邻的段,所以您可以在一夜之间无头运行测试并使用最终的打印行(尽管如果您的亮度非常糟糕,那么不太准确的“围绕此点 5 兆”格式可能会短一些)。
最后结果:
答案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 更加彻底并运行多次传递,但它可能在大多数情况下都有效,并且具有在丢失另外几个扇区时不需要手动干预的优点。