Как внести в черный список неправильный сектор оперативной памяти в соответствии с индикацией ошибки MemTest86 +?


28

MemTest86 + (версия, включенная в Ubuntu 13.04) говорит

Failing address: 002f796c48 -    759.5 MB

Что я должен указать в memmapпараметре ядра, чтобы обойти эту область?

Я попытался запустить, memtester 770MBи он говорит, что все в порядке, поэтому не похоже, что показания MemTest означают ошибку в 759,5-м МБ с самого начала.

Как интерпретировать эту индикацию MemTest для настройки memmap?

У меня нет денег, чтобы купить новую оперативную память сейчас, и ошибка кажется единственной, поэтому я надеюсь, что смогу просто переопределить ее.


FWIW, ядро ​​помечает определенные страницы как «зарезервированные», если оно обнаруживает плохой сегмент, но может восстановиться. Вывод «free -m» показывает степени двух для итогов? Я упоминаю это как способ объяснить, почему memtester не видит плохую RAM, а memtest86 + может.
Братчли

Фактически не похоже на силу двух: i.stack.imgur.com/l86L1.png
Иван

К тому времени, когда обнаружена ошибка (если у вас даже есть ecc ram), обычно уже слишком поздно. Кроме того, free -m никогда не сообщает о четной степени двойки, поскольку bios и kernel оба оставляют за собой некоторый ram
Псуси

1
Я мечтаю купить ноутбук ECC, но никогда не смогу найти какие-либо доступные предложения, похоже, их нет.
Иван

Похоже, что ядро ​​также использует printk, когда находит плохую страницу (строка 264-265).
Братчли

Ответы:


26

memmap

Есть это руководство под названием: Bad Memory HowTo, в котором обсуждается отключение памяти через ядро ​​с использованием memmapаргумента ядра. Согласно инструкции, у вас есть 2 варианта memmap:

  • Отключить все после плохой памяти - (mem=###M option)
  • Отключить только память вокруг плохой памяти - (memmap=#M$###M option)

С первой опцией, если memtest сообщает, что на 600 МБ имеется плохая память, вы можете отключить ОЗУ с этой точки до конца ОЗУ следующим образом:

 mem=595M

Если в 802M и 807M имеется плохая RAM, вы можете отключить 10M RAM, начиная с 800M:

memmap=10M$800M

ПРИМЕЧАНИЕ. Это приведет к попаданию в черный список 10M после базового адреса 800M. Вы должны запустить memtest86+потом, чтобы подтвердить, что этот аргумент верен.

BadRAM

Для Ubuntu есть патч под названием BadRam. Это очень хорошо описано здесь в этом посте под названием: BadRAM на сайте сообщества Ubuntu.

После применения патча к ядру, используя информацию с этой страницы, вы вносите изменения в настройки Grub2:

выдержка из этого сайта для Grub2

Конфигурационный файл GRUB2 в Natty содержит строку для настройки исключений из ядра. Итак, я предполагаю, что это предпочтительный способ отображения раздела памяти, который показывает ошибки. Линия, которую я установил, была

GRUB_BADRAM = "0x7DDF0000,0xffffc000"

Предлагаемый способ на каждом веб-сайте, который я смог найти, состоял в том, чтобы запустить memtest86 и показать настройки BadRAM. memtest86 дал мне страницу, в которую я должен был войти. Я мог видеть, что все адреса были в одном блоке 16K, поэтому я просто хотел отобразить этот блок 16K из строя. Вот как я сгенерировал правильную запись.

Первый параметр прост. Это базовый адрес плохой памяти. В моем случае я мог видеть, что все плохие адреса были больше, чем 0x7DDF0000 и меньше, чем 0x7DDF4000. Итак, в качестве начального адреса я взял начало блока 16К.

Второй параметр - это маска. Вы ставите 1, где диапазон адресов, который вы хотите, имеет те же значения, и 0, где он будет меняться. Это означает, что вам нужно выбрать диапазон адресов так, чтобы менялись только младшие биты. Глядя на мой адрес, первая часть маски проста. Вы хотите начать с 0xffff. Для следующего куска я объясню с помощью битовых карт. Я хочу в диапазоне от 0000 до 0011. Таким образом, маска для бадрама будет 1100 или гекс с. Последние 3 полубайта должны быть все 0 в маске, так как мы хотим, чтобы весь диапазон отображался. Итак, мы получаем общий результат 0xffffc000.

После установки этой строки в / etc / default / grub я запустил sudo update-grub и перезагрузился, и моя плохая память больше не использовалась. Никаких исправлений ядра не требуется для определения плохой памяти с помощью этого метода.

Продолжение № 1

Просматривая страницу википедии для memtest86 +, она выглядит следующим образом:

выдержка из страницы Википедии Memtest86

Начиная с Memtest86 2.3 и Memtest86 + 1.60, программа может выводить список плохих областей памяти в формате, ожидаемом патчем BadRAM для ядра Linux; Используя эту информацию, система Linux может надежно использовать модуль ОЗУ, даже если у него есть несколько ошибок. Grub2 может предоставить эту же информацию непатентованному ядру, что устраняет необходимость в патче BadRAM.

Также я наткнулся на эту страницу Gentoo, в которой указано memmap=...использование шестнадцатеричного адреса, чтобы вы могли указать его следующим образом:

memmap=5M$0x2f796c48

5M - всего лишь предположение, очевидно, вы можете настроить его ниже или выше в зависимости от того, сколько оперативной памяти в этом регионе вы хотите / нужно пропустить.

Наконец, вы также можете указать размер в шестнадцатеричном виде:

memmap=0x10000$0x2f796c48

Будет игнорировать 64 КБ, начиная с адреса 0x2f796c48.

Ссылки


«800–804 млн.» Должно быть «
800–810 млн

Это может быть, но то, что я написал, тоже нормально, хотя оно выбрасывает больше памяти, чем 4M между 800M и 810M.
slm

1
1. Я знаю об этой memmapопции, но вопрос в том, как интерпретировать вывод memtest86 +. Я привел конкретный пример вывода memtest86 + и прошу помощи в memmap соответствующей настройке в данном конкретном случае. 2. «После этого вы должны запустить memtest86 +, чтобы подтвердить, что этот аргумент верен». - memtest86 + запускается перед ядром ОС, поэтому я серьезно сомневаюсь, что memmapопция ядра Linux может повлиять на это.
Иван

@Ivan, 1. Я думал, что это было очевидно, учитывая примеры, которые я включил, но вам нужно было бы сказать что-то вроде: memmap=5M$759Mдля вашего конкретного случая, заданный memtest86 + не работает на 759,5 МБ. 2. Я имел в виду, что вы должны также передать memmap=...опцию в memtest86 +. Это было непроверено / не подтверждено мной, но то, что вы можете сделать с memtest86 +.
SLM

1
Хорошо спасибо. Я не был уверен, что означает «002f796c48 - 759,5 МБ» (возможно, это может быть 759,5 мегабайт после адреса 002f796c48 или что-то в этом роде), и я никогда не подозревал, что могу передать параметры ядра Linux в MemTest86 + (я думал, что это ничего не значит делать с линуксом).
Иван

14

Memtest86 + (я использовал 4.20) может выводить формат badram напрямую.

  1. Нажмите «c», чтобы перейти к диалогу конфигурации диалог конфигурации memtest

  2. Затем «4» для «Режим сообщения об ошибке»

    диалог режима отчета об ошибках memtest

  3. Затем «3» для «паттернов BadRAM»

Вывод из списка отдельных неудачных тестов изменится на серию строк badram =, каждая из которых содержит еще один новый поврежденный сектор. Поскольку линии добавляют и объединяют соседние сегменты, вы можете просто запустить тест без заголовка и использовать последнюю напечатанную строку (хотя, если у вас действительно плохое затемнение, менее точный формат «5 мегапикселей вокруг этой точки», вероятно, будет немного короче). ).

Конечный результат:

Memtest86 + показывает вывод badram


4
Теперь, если бы мне не нужно было копировать это вручную и вместо этого передавать GRUB без повторного ввода ошибок, это было бы замечательно.
Этеш Чоудхури

8
Я сделал его фотографию (телефон с камерой), загрузил его в GIMP, => Оттенки серого => Инвертировать => Контрастность / Гамма, а затем передал его tesseract ${IMG} stdout.. Затем проверил и исправил строку перед вставкой в ​​/ etc / default / grub ... Вероятно, потребовалось столько же времени, сколько и вручную, введя его сразу ^^
eMPee584

3
Определенно веселее, чем делать это вручную
летающие овцы
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.