Один из распространенных сценариев сбоя сервера - это плохая память DRAM, иногда даже при использовании памяти ECC.
memtest86+
- один из самых полезных инструментов для диагностики проблем с DRAM. Поскольку он загружается в начале памяти, мне было интересно, memtest86+
проверяет часть памяти, которая memtest86+
загружается в.
Выделена ли память для memtest86+
настолько мал, что это не имеет значения, или возможно ли, что memtest86+
может пропустить дефект в DRAM, потому что он не может проверить участки памяти, в которых он находится?
Очевидно, что memtest86 + не может проверить область памяти, которая в настоящее время содержит исполняемый код memtest86 + (но если в этой области есть ошибки памяти, очень вероятно, что сам тест выйдет из строя). Однако memtest86 + может переместить свой собственный код на другой адрес во время выполнения, и, используя этот трюк, он может протестировать всю память, которую ему разрешено использовать микропрограммой (BIOS) - но не всю сразу.
Это перемещение кода описано в README.background внутри архива исходного кода memtest86 + (файл немного устарел - например, в нем указано, что для кода memtest86 + используются адреса 0x2000 и 0x200000, но нижний адрес, определенный в источнике, является фактически 0x10000, а старший адрес - 0x2000000 или 0x300000 в зависимости от объема памяти на машине).
Но даже с помощью этой уловки перемещения memtest86 + не может протестировать всю память по следующим причинам:
Обычно микропрограмма (BIOS) резервирует некоторые области ОЗУ для собственного использования (например, таблицы ACPI). Хотя к этим областям ОЗУ может получить доступ ЦП, запись в них чего-либо может привести к непредсказуемому поведению.
Некоторая часть оперативной памяти используется для Режим управления системой и даже недоступен из ЦП за пределами привилегированного кода SMM.
Диапазон адресов RAM от 640K до 1M недоступен из-за особенностей устаревшей структуры памяти ПК (часть этой RAM может использоваться как тень для BIOS ROM и для SMM, другие части могут быть полностью недоступны).
Нет, memtest не может проверить собственную память. Однако он настолько мал (всего несколько килобайт), что не имеет значения. РЕДАКТИРОВАТЬ: это утверждение неверно, поскольку, как указано в выбранном ответе, memtest может динамически перемещаться для тестирования все адресуемая пользователем память.
-
Теоретически современный процессор может во время загрузки настроить часть своего кеша как программируемую память, изнутри могут быть запущены очень маленькие программы (например, memtest). без касаясь DRAM вообще.
Однако это особенность модели (которая требует поддержки BIOS), и я не думаю, что memtest ее использует.