Испытывает ли memtest86 + память, которая используется для запуска?

65

Один из распространенных сценариев сбоя сервера - плохой DRAM, иногда даже при использовании памяти ECC.

memtest86+является одним из самых полезных инструментов для диагностики проблем DRAM. Поскольку он загружает себя в начале памяти, мне было интересно, memtest86+проверяет ли часть памяти, которая memtest86+загружается в.

Распределена ли память memtest86+так мало, что это не имеет значения, или возможно, что она memtest86+может пропустить дефект в DRAM, потому что она не может проверить места памяти, в которых она находится?

Робин
источник
8
Хотя этот вопрос актуален для сервера, он также актуален для обычного ПК, поэтому я проголосовал за то, чтобы перенести этот вопрос на Супер-пользователя, где он может охватить больше людей.
Кристиан Чиупиту

Ответы:

78

Очевидно, что memtest86 + не может проверить область памяти, которая в настоящее время содержит исполняемый код memtest86 + (но если в этой области есть ошибки памяти, весьма вероятно, что сам тест завершится сбоем). Тем не менее, memtest86 + может перемещать свой собственный код по другому адресу во время выполнения, и с помощью этого трюка он может проверить всю память, которую ему разрешено использовать для прошивки (BIOS), но не все сразу.

Это перемещение кода описано в файле README.background внутри архива исходного кода memtest86 + (файл немного устарел - например, в нем говорится, что адреса, используемые для кода memtest86 +, это 0x2000 и 0x200000, но низкий адрес, определенный в источнике, фактически 0x10000, а старший адрес - 0x2000000 или 0x300000 в зависимости от объема памяти в машине).

Но даже с этим трюком перестановки memtest86 + не может проверить всю память по следующим причинам:

  • Обычно микропрограмма (BIOS) резервирует некоторые области ОЗУ для собственного использования (например, таблицы ACPI). В то время как ЦП может получить доступ к этим областям ОЗУ, запись чего-либо в них может привести к непредсказуемому поведению.

  • Некоторая часть ОЗУ используется для режима управления системой и даже недоступна для ЦП вне привилегированного кода SMM.

  • Диапазон адресов ОЗУ от 640 КБ до 1 МБ недоступен из-за особенностей устаревшей структуры памяти ПК (часть этой ОЗУ может использоваться как тень для ПЗУ BIOS и для SMM, другие части могут быть полностью недоступны).

Сергей Власов
источник
1
Интересно, что я упустил возможность переезда. Очевидно, что SMM и тому подобное находятся вне диапазона (кроме конкретной поддержки BIOS).
Сёданшок
Эти сопоставленные регионы, как правило, исключают DRAM, так как к чему-то еще обращаются? ПЗУ и периферийные устройства говорят.
Маккензм
3
если у вас есть несколько модулей оперативной памяти, выполните второй тест после замены их ...
JFL
Возможно ли, чтобы ошибка памяти была правильной, чтобы memtest неправильно сообщал об успехе из-за переписанных инструкций? Или, скорее, сколько ошибок это займет?
Джон Дворак
3
@JanDvorak: В теории это возможно, конечно. На практике я бы сказал, что это лишь немного более вероятно, чем стучать головой по клавиатуре и случайным образом набирать сонет Шекспира.
Ильмари Каронен
5

Нет, memtest не может проверить свою память. Однако он настолько мал (всего несколько килобайт), что вряд ли имеет значение. РЕДАКТИРОВАТЬ: это утверждение неверно, поскольку, как указано в выбранном ответе, memtest может динамически перемещать себя для проверки всей адресуемой памяти пользователя.

-

Теоретически, современный процессор может во время загрузки сконфигурировать часть своего кэша как программируемую память, из очень маленьких программ (как memtest) можно запускать, не касаясь DRAM вообще.

Тем не менее, это особенность модели (которая требует поддержки BIOS), и я не думаю, что memtest использует ее.

shodanshok
источник
Спасибо за ваш ответ. memtestтакже тестирует кэш процессора. Итак, если memtestбы он был загружен в этот кеш, то эту часть кеша нельзя было бы протестировать, что более проблематично, потому что оно намного меньше памяти?
Робин
2
Судя по документации memtest86, он не тестирует кэш процессора, по крайней мере, напрямую. Более того, современные процессоры имеют отдельные инструкции и кеш данных (I $ и D $). Исполняемый код загружается в кэш инструкций и не может быть непосредственно изменен / перезаписан
shodanshok
1
memtest86 + определенно проверяет кеш данных процессора, но это не имеет значения для этого вопроса. Еще раз спасибо за ваш ответ.
Робин
3
Вы в этом уверены? Я думал, что он копировал себя куда-то еще во время тестирования памяти, в которой он обычно живет. Вот почему каждый тест имеет медленную часть (большую часть памяти) и действительно быструю часть (небольшую часть, где хранится его код / ​​данные).
Питер Кордес
1
@DmitryGrigoryev: А, ладно .. так что я узнал кое-что еще :-) Круто, спасибо!
Робин