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


28

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

Failing address: 002f796c48 -    759.5 MB

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

我尝试运行memtester 770MB,它说一切都很好,因此看上去MemTest的指示从一开始就没有出现第759.5 MB的错误。

如何解释此MemTest指示进行配置memmap

我现在没有钱买新的RAM,并且错误似乎是单一的,所以我希望我可以重写它。


FWIW,如果内核检测到错误的段但能够恢复,则内核会将某些页面标记为“保留”。“ free -m”的输出是否对总数显示2的幂?我提到这是为了解释为什么memtester看不到坏的RAM,而memtest86 +可以看到。
布莱奇利2013年

看起来实际上不是两个的幂:i.stack.imgur.com/l86L1.png
伊万

在检测到错误时(如果您甚至有ecc ram),通常为时已晚。另外,free -m从来没有报告偶数为2的幂,因为bios和内核都保留了一些内存。
psusi

1
我梦想买一台ECC笔记本电脑,但找不到任何报价,好像它们不存在。
伊万

看起来内核在发现错误页面时也为printk(第264-265行)。
布拉奇利

Answers:


26

记忆图

本教程的标题为:Bad Memory HowTo,它讨论使用内核memmap参数通过内核禁用内存。根据操作方法,您有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社区站点上的标题为:BadRAM的文章中对此进行了很好的介绍。

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

该网站摘录的Grub2

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

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开始,程序可以以BadRAM补丁所期望的格式输出用于Linux内核的坏RAM区域列表。使用此信息,Linux系统即使有一些坏位也可以可靠地使用RAM模块。Grub2能够将这些信息提供给未打补丁的内核,从而无需BadRAM补丁。

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

memmap=5M$0x2f796c48

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

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

memmap=0x10000$0x2f796c48

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

参考文献


我认为“ 800M到804M”应该是“ 800M到810M” ...
Hauke Laging

可以,但是我写的也可以,即使它在800M至810M之间比4M丢掉了更多的内存。
slm

1
1.我知道该memmap选项,但问题更多是关于如何解释memtest86 +输出的信息。我给的Memtest86 +输出的一个具体的例子,并在配置求人memmap 因此在这种特殊情况下。2.“之后应运行memtest86 +以确认此参数正确。” -memtest86 + 操作系统内核之前运行因此我严重怀疑memmapLinux内核选项是否会影响它。
伊万

@Ivan,1.考虑到我包含的示例,我认为这是显而易见的,但是您需要说些类似的话:memmap=5M$759M对于您的特定情况,鉴于memtest86 +的失败是759.5MB。2.我的意思是您也应该将该memmap=...选项传递给memtest86 +。我未经测试/确认,但是您可以使用memtest86 +进行此操作。
slm

1
好,谢谢。我不确定“ 002f796c48-759.5 MB”是什么意思(也许在002f796c48地址之后可能是759.5 meg或类似的东西),而且我从不怀疑我可以将Linux内核参数传递给MemTest86 +(我认为这本身与使用Linux)。
伊万

14

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

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

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

    memtest错误报告模式对话框

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

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

最后结果:

Memtest86 +显示Badram输出


4
现在,如果我不必手动复制该副本,而是将其移交给GRUB,而无需重新输入错误,那将是很棒的。
Ehtesh Choudhury 2014年

8
我所做的就是拍张照片(相机手机),将其加载到GIMP中,=>灰度=>反转=>对比度/伽玛,然后将其交给tesseract ${IMG} stdout..然后验证并更正该行,然后再插入/ etc / default / grub ...可能需要花费与手动输入一样长的时间^^
eMPee584

3
绝对比手动做起来有趣
放飞绵羊
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.