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 并重新启动,我的坏记忆不再被使用。使用这种方法不需要内核补丁来映射坏内存。
查看 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格式。
按“c”进入配置对话框
然后是“错误报告模式”的“4”
然后是“BadRAM 模式”的“3”
输出将从单个测试失败列表更改为一系列 badram= 行,每行包含一个新的坏扇区。因为这些线会附加并合并相邻的线段,所以您可以在一夜之间无头地运行测试并使用最终的打印线(尽管如果您的暗淡非常糟糕,那么不准确的“5 megs around this point”格式可能会更短一些)。
最后结果:
非常肮脏但非常好的解决方法:运行用户空间 memtester,等待它发现错误。例如,让它位于 0xfce2ea31 。
然后再次运行 memtester,但在该物理地址上,因此:
memtester -p 0xfce20000 64k 128
Run Code Online (Sandbox Code Playgroud)
可以肯定的是,如果你牺牲的不仅仅是有问题的地址的页面,那就更好了。这里我们牺牲了错误地址周围的 64kByte。
如果一切顺利,它将再次更快地找到错误的内存位置。
然后使用 ctrl/z 暂停 memtester 进程。
结果:在memtester进程被挂起之前,它不会占用更多的资源,但没有其他进程能够访问故障内存。因为它将由memtester分配。
在大型远程服务器上特别有用。挂起的进程可以一直保留到新 RAM 未发货为止。或者也许直到下一个圣诞节,那时停机就不再是大问题了。