Memtest86+ — это бесплатный автономный тестер памяти с открытым исходным кодом для компьютеров с архитектурой x86 и x86-64. Он обеспечивает гораздо более тщательную проверку памяти, чем тесты памяти BIOS.
Он также может получить доступ практически ко всей памяти компьютера, не ограничиваясь памятью, используемой операционной системой, и не зависит от какого-либо базового программного обеспечения, такого как библиотеки UEFI.
Memtest86+ можно загружать и запускать либо напрямую через BIOS ПК (устаревший или UEFI), либо через промежуточный загрузчик, который поддерживает протокол загрузки 16-битной, 32-битной, 64-битной версии Linux или EFI. Он должен работать на любом процессоре класса Pentium или более поздней версии, 32- или 64-битном.
Бинарные выпуски (как стабильные, так и ночные сборки) доступны на memtest.org.
Memtest86+ v6.00 был основан на PCMemTest, который был ответвлением и переписанной более ранней версией Memtest86+ v5, которая, в свою очередь, была ответвлением MemTest-86. Целью переписывания PCMemTest было:
В процессе создания PCMemTest был исключен ряд функций Memtest86+ v5, которые не были строго необходимы для тестирования системной памяти. В частности, не было предпринято никаких попыток измерить скорость кэша и основной памяти или определить и сообщить тип DRAM. Эти функции были добавлены и расширены в Memtest86+ v6.0, чтобы создать унифицированную полнофункциональную версию.
Memtest86+ выпускается на условиях Стандартной общественной лицензии GNU версии 2 (GPLv2). Помимо положений GPL, нет никаких ограничений на использование, как в частных, так и в коммерческих целях. Подробности смотрите в файле ЛИЦЕНЗИИ.
Сборка тестируется только в системе Linux, но должна быть возможна в любой системе, использующей набор инструментов GNU и формат файлов ELF. Необходимые инструменты:
Чтобы создать 32-битный образ, перейдите в каталог build32
и введите make
. В результате получается файл двоичного образа memtest.bin
, который можно загрузить непосредственно с помощью устаревшего BIOS (в режиме дискеты) или с помощью промежуточного загрузчика с использованием 16-битного протокола загрузки Linux, а также файл двоичного образа memtest.efi
, который можно загрузить напрямую. с помощью 32-битного UEFI BIOS. Любой образ может быть загружен с помощью промежуточного загрузчика с использованием 32-битного или 32-битного протокола загрузки EFI с передачей обслуживания Linux.
Чтобы создать 64-битный образ, перейдите в каталог build64
и введите make
. В результате получается файл двоичного образа memtest.bin
, который можно загрузить непосредственно с помощью устаревшего BIOS (в режиме дискеты) или с помощью промежуточного загрузчика с использованием 16-битного протокола загрузки Linux, а также файл двоичного образа memtest.efi
, который можно загрузить напрямую. с помощью 64-битного UEFI BIOS. Любой образ может быть загружен с помощью промежуточного загрузчика с использованием 32-, 64- или 64-битных протоколов загрузки EFI с передачей обслуживания EFI.
В любом случае, чтобы создать ISO-образ, который можно использовать для создания загрузочного компакт-диска, DVD-диска или USB-накопителя, введите make iso
. В результате получится файл ISO-образа memtest.iso
. Затем его можно записать непосредственно на чистый компакт-диск или DVD-диск или на флэш-накопитель USB, который затем можно загрузить непосредственно с помощью устаревшего BIOS или BIOS ПК с UEFI.
Обратите внимание, что при записи на USB-накопитель образ ISO должен быть записан непосредственно («сброшен») на необработанное устройство либо с помощью команды dd
, либо с помощью утилиты, обеспечивающей ту же функциональность.
При использовании промежуточного загрузчика файл memtest.bin
или файл memtest.efi
следует хранить в разделе диска, к которому имеет доступ загрузчик, а конфигурацию загрузчика следует обновить для загрузки из этого файла, как если бы это было ядро Linux с нет начального RAM-диска. Распознаются несколько параметров командной строки загрузки, как описано ниже. При использовании 16-битного протокола загрузки Memtest86+ будет использовать дисплей в текстовом режиме (640x400). При использовании 32-битного или 64-битного протокола загрузки Memtest86+ будет использовать отображение либо в текстовом, либо в графическом режиме, как указано в структуре boot_params
переданной ему загрузчиком. В графическом режиме размер предоставленного кадрового буфера должен быть не менее 640x400 пикселей; если больше, дисплей будет центрирован. Если система загружалась в режиме UEFI, необходимо использовать графический режим.
В целях тестирования также есть возможность создать образ ISO, который использует GRUB в качестве промежуточного загрузчика. Подробности смотрите Makefile
в каталоге build32
или build64
. Образ ISO является как устаревшим, так и загружаемым через UEFI, поэтому вам нужны модули GRUB как для устаревшей загрузки, так и для загрузки EFI, установленные в вашей системе сборки (например, в Debian необходимые модули GRUB расположены в пакетах grub-pc-bin
, grub-efi-ia32-bin
и grub-efi-amd64-bin
). Возможно, вам придется изменить некоторые пути и имена файлов в Makefile, чтобы они соответствовали именам в вашей системе.
Файлы конфигурации GRUB, содержащиеся в каталоге grub
, предназначены для использования в тестовом ISO, но также служат примером загрузки Memtest86+ из GRUB.
Промежуточный загрузчик может передать Memtest86+ командную строку загрузки. Командная строка может содержать один или несколько параметров, разделенных пробелами. Каждая опция состоит из имени опции, за которым может следовать знак =
, а также одного или нескольких параметров, разделенных запятыми. Распознаются следующие варианты:
0x
(например: 0xFEDC9000) Memtest86+ поддерживает как устаревший интерфейс клавиатуры (с использованием портов ввода-вывода 0x60 и 0x64), так и USB-клавиатуры (с использованием собственных драйверов USB-устройств). Один или другой или оба можно выбрать через командную строку загрузки. Если не указано иное в командной строке, по умолчанию используются оба, если система загружалась в режиме UEFI, в противном случае используется только устаревший интерфейс.
Старые версии BIOS обычно поддерживают эмуляцию устаревшей клавиатуры USB, в результате чего USB-клавиатуры действуют как устаревшие клавиатуры, подключенные к портам 0x60 и 0x64. Часто это можно включить или отключить в меню настройки BIOS. Если драйверы USB-устройств Memtest86+ включены, они переопределят это и получат прямой доступ к любой USB-клавиатуре. Обратной стороной этого является то, что контроллеры USB и драйверы устройств требуют, чтобы некоторая память была зарезервирована для их личного использования, а это означает, что память не может быть охвачена тестами памяти. Поэтому, чтобы максимизировать охват тестированием, если оно поддерживается, включите эмуляцию устаревшей клавиатуры USB и, при загрузке в режиме UEFI, добавьте keyboard=legacy
в командной строке загрузки.
ПРИМЕЧАНИЕ . Некоторые BIOS UEFI поддерживают эмуляцию устаревшей клавиатуры USB только при включении системного модуля совместимости (CSM) в настройках BIOS. Другие поддерживают его только при загрузке в устаревшем режиме.
Многие USB-устройства не полностью соответствуют спецификации USB. Если датчик USB-клавиатуры зависает или не может обнаружить клавиатуру, попробуйте различные обходные пути, предоставляемые опцией загрузки «usbinit».
ПРИМЕЧАНИЕ . Горячее подключение в настоящее время не поддерживается драйверами USB Memtest86+. При их использовании ваша USB-клавиатура должна быть подключена перед запуском Memtest86+ и должна оставаться подключенной на протяжении всего теста.
В некоторых машинах 2-в-1 используется ЖК-панель, которая изначально представляет собой дисплей в портретном режиме, но при подключении к клавиатуре крепится сбоку. При использовании дисплея в графическом режиме Memtest86+ может поворачивать дисплей в соответствии с показаниями. Добавьте параметр «screen.rhs-up» или «screen.lhs-up» в командную строку загрузки, в зависимости от ориентации ЖК-панели. Ожидается, что при использовании дисплея в текстовом режиме BIOS позаботится об этом автоматически.
При загрузке в устаревшем режиме Memtest86+ будет использовать разрешение экрана, установленное BIOS или промежуточным загрузчиком. При загрузке в режиме UEFI Memtest86+ обычно выбирает наименьшее доступное разрешение экрана, охватывающее его дисплей 640x400 пикселей. Некоторые BIOS возвращают неверную информацию о доступных режимах отображения, поэтому вы можете обойти это, добавив параметр «screen.mode=" в командной строке загрузки.
Обратите внимание, что при использовании поворота дисплея указанное разрешение экрана относится к неповернутому дисплею.
После загрузки Memtest86+ инициализирует свой дисплей, затем делает паузу на несколько секунд, чтобы позволить пользователю настроить его работу. Если ни одна клавиша не нажата, все тесты автоматически начнут выполняться с использованием одного ядра ЦП, и это будет продолжаться бесконечно, пока пользователь не перезагрузит или не остановит машину.
При запуске и выполнении тестов Memtest86+ реагирует на следующие клавиши:
Обратите внимание, что тестирование останавливается, когда включена блокировка прокрутки и область прокрутки заполнена.
Меню конфигурации позволяет пользователю:
Во всех случаях цифровые клавиши можно использовать в качестве альтернативы функциональным клавишам (1 = F1, 2 = F2, ... 0 = F10).
Режим сообщения об ошибках можно изменить в любое время, не прерывая текущую последовательность испытаний. Статистика ошибок собирается независимо от текущего режима отчетов об ошибках (поэтому при переключении в режим сводки ошибок будет показана статистика, накопленная с момента начала текущей последовательности испытаний). Шаблоны BadRAM накапливаются только в режиме BadRAM. Области карты памяти Linux накапливаются только в режиме карты памяти. Номера неверных страниц накапливаются только в режиме плохой страницы.
Любое изменение выбранных тестов, диапазона адресов или режима последовательности ЦП приведет к запуску новой последовательности тестов и сбросу статистики ошибок.
В режиме «Только подсчет ошибок» отображается общее количество ошибок, обнаруженных с момента начала текущей последовательности испытаний.
В режиме сводки ошибок отображается следующая информация:
В режиме отдельных ошибок для каждого экземпляра ошибки отображается следующая информация:
Режим шаблонов BadRAM накапливает и отображает шаблоны ошибок для использования с функцией Linux BadRAM или командой badram GRUB. Строки печатаются в виде badram=F1,M1,F2,M2...
В каждой паре F,M
буква F
представляет адрес неисправности, а буква M
представляет собой битовую маску для этого адреса. Эти шаблоны утверждают, что ошибки произошли по адресам, которые равны F во всех битах 1
в M. Такой шаблон может фиксировать больше ошибок, чем существует на самом деле, но, по крайней мере, все ошибки фиксируются. Эти шаблоны были разработаны для фиксации регулярных шаблонов ошибок, вызванных структурой оборудования, в кратком синтаксисе.
Шаблоны BadRAM увеличиваются постепенно, а не рассчитываются на основе обзора всех ошибок. Число пар ограничено 20 по ряду практических соображений. В результате, в исключительных случаях создание шаблонов вручную на основе выходных данных в режиме адресной печати может дать лучшие результаты.
ПРИМЕЧАНИЕ. Как упоминалось в описаниях отдельных тестов, тест адреса ходячих единиц (тест 0) и тест перемещения блока (тест 7) не влияют на шаблоны BadRAM, поскольку эти тесты не позволяют определить точный адрес неисправности. .
Режим карты памяти Linux накапливает и отображает неисправные области памяти для использования с [параметром командной строки загрузки карты памяти Linux] (https://www.kernel.org/doc/Documentation/admin-guide/kernel-parameters.txt). Строки печатаются в виде memmap=S1$A1,S2,A2...
В каждой паре S,A
A
представляет первый адрес в регионе, а S
— размер региона (в байтах). Записывается до 20 неисправных областей памяти. Как только будет обнаружено более 20 регионов с соседними неисправными местоположениями, регионы будут объединены, что означает, что некоторые регионы включают в себя исправные местоположения. Программа попытается свести к минимуму количество включенных в нее исправных мест.
П р и м е ч а н и е — Как упоминалось в описаниях отдельных тестов, тест адреса ходячих единиц (тест 0) и тест перемещения блока (тест 7) не влияют на неисправные области памяти, поскольку эти тесты не позволяют определить точный адрес неисправности. определенный.
Режим плохих страниц накапливает и отображает номера ошибочных страниц памяти. Их можно использовать с командой Windows bcdedit для добавления этих страниц в список памяти Windows PFA. Номера страниц отображаются либо в виде одного шестнадцатеричного числа (например, 0x20
), либо в виде диапазона шестнадцатеричных номеров страниц (например, 0x20..0x2a
). Записывается до 20 диапазонов ошибочных страниц. Как только будет обнаружено более 20 диапазонов смежных ошибочных страниц, диапазоны будут объединены, что означает, что некоторые диапазоны включают исправные страницы. Программа постарается свести к минимуму количество включенных исправных страниц.
П р и м е ч а н и е — Как упоминалось в описаниях отдельных тестов, тест адреса ходячих единиц (тест 0) и тест перемещения блока (тест 7) не влияют на количество ошибочных страниц, поскольку эти тесты не позволяют определить точный адрес неисправности. определенный.
Имейте в виду, что не все ошибки, сообщаемые Memtest86+, связаны с плохой памятью. Тест неявно проверяет процессор, кэши и материнскую плату. В ходе испытания невозможно определить причину возникновения сбоя. Большинство сбоев будет связано с проблемой с памятью. В противном случае единственным вариантом является замена деталей до тех пор, пока неисправность не будет устранена.
После обнаружения ошибки памяти определение неисправного модуля не является однозначной процедурой. При большом количестве производителей материнских плат и возможных комбинациях слотов памяти было бы сложно, если не невозможно, собрать полную информацию о том, как конкретная ошибка будет связана с неисправным модулем памяти. Однако есть шаги, которые можно предпринять для определения неисправного модуля. Вот некоторые методы, которые вы можете использовать:
Удаление модулей
Вращающиеся модули
Замена модулей
Иногда ошибки памяти появляются из-за несовместимости компонентов. Модуль памяти может нормально работать в одной системе и не работать в другой. Это не редкость и является источником путаницы. Компоненты не обязательно плохие, но некоторых комбинаций следует избегать.
В подавляющем большинстве случаев ошибки, сообщаемые Memtest86+, действительны. Некоторые системы заставляют Memtest86+ путаться в размере памяти и пытаться протестировать несуществующую память. Это приведет к тому, что большое количество последовательных адресов будет отображаться как плохие, и, как правило, будет много битов ошибок. Если у вас относительно небольшое количество ошибочных адресов и только один или два бита ошибки, вы можете быть уверены, что ошибки действительны. Также периодические ошибки всегда действительны.
Все действительные ошибки памяти должны быть исправлены. Вполне возможно, что конкретная ошибка никогда не проявится при нормальной работе. Однако работать с нехваткой памяти рискованно и может привести к потере данных и даже повреждению диска.
Memtest86+ не может диагностировать многие типы сбоев ПК. Например, неисправный процессор, который приводит к сбою вашей ОС, скорее всего, приведет к такому же сбою Memtest86+.
Время, необходимое для полного прохождения Memtest86+, сильно зависит от скорости процессора, скорости памяти и ее размера. Memtest86+ выполняется бесконечно. Счетчик проходов увеличивается каждый раз при выполнении всех выбранных тестов. Обычно одного прохода достаточно, чтобы обнаружить все ошибки, кроме самых малозаметных. Однако для полной уверенности при подозрении на периодические ошибки рекомендуется проводить тестирование в течение более длительного периода.
Существует много хороших подходов к тестированию памяти. Однако многие тесты просто выбрасывают в память некоторые шаблоны, не задумываясь об архитектуре памяти или о том, как лучше всего обнаруживать ошибки. Это хорошо работает при серьезных сбоях памяти, но мало помогает при поиске периодически возникающих ошибок. Тесты памяти на основе BIOS бесполезны для обнаружения периодически возникающих ошибок памяти.
Чипы памяти состоят из большого массива плотно упакованных ячеек памяти, по одной на каждый бит данных. Подавляющее большинство периодических сбоев являются результатом взаимодействия этих ячеек памяти. Часто запись в ячейку памяти может привести к тому, что в одну из соседних ячеек будут записаны одни и те же данные. Эффективный тест памяти пытается проверить это условие. Поэтому идеальной стратегией тестирования памяти будет следующая:
Должно быть очевидно, что эта стратегия требует точного знания того, как ячейки памяти расположены на кристалле. Кроме того, существует бесконечное количество возможных схем расположения микросхем для разных типов микросхем, и производители делают эту стратегию непрактичной. Однако существуют алгоритмы тестирования, которые могут приблизить эту идеальную стратегию.
Memtest86+ использует два алгоритма, которые обеспечивают разумное приближение к идеальной стратегии тестирования, описанной выше. Первая из этих стратегий называется скользящими инверсиями. Тесты скользящей инверсии работают следующим образом:
Этот алгоритм является хорошим приближением к идеальному тесту памяти, но имеет некоторые ограничения. Сегодня большинство чипов высокой плотности хранят данные шириной от 4 до 16 бит. С микросхемами шириной более одного бита невозможно выборочно читать или записывать только один бит. Это означает, что мы не можем гарантировать, что все соседние ячейки были проверены на взаимодействие. В этом случае лучшее, что мы можем сделать, — это использовать некоторые шаблоны, чтобы гарантировать, что все соседние ячейки по крайней мере записаны со всеми возможными комбинациями единиц и нулей.
Также можно видеть, что кэширование, буферизация и выполнение вне очереди будут мешать алгоритму движущихся инверсий и делать его менее эффективным. Кэширование можно отключить, но буферизацию памяти в новых высокопроизводительных чипах отключить невозможно. Чтобы устранить это ограничение, был создан новый алгоритм под названием Modulo-20. На этот алгоритм не влияет кэширование или буферизация. Алгоритм работает следующим образом:
Этот алгоритм обеспечивает почти тот же уровень проверки смежности, что и движущиеся инверсии, но на него не влияет кэширование или буферизация. Поскольку отдельные проходы записи (1.1, 1.2) и чтения (1.4) выполняются для всей памяти, мы можем быть уверены, что все буферы и кэш очищаются между проходами. Выбор 20 в качестве размера шага был несколько произвольным. Более крупные шаги могут быть более эффективными, но их реализация потребует больше времени. Выбор 20 казался разумным компромиссом между скоростью и тщательностью.
Memtest86+ выполняет серию пронумерованных тестов для проверки на наличие ошибок. Эти тесты состоят из комбинации алгоритма тестирования, шаблона данных и кэширования. Порядок выполнения этих тестов был организован таким образом, чтобы ошибки обнаруживались как можно быстрее. Далее следует описание каждого теста.
Чтобы обеспечить тестирование памяти объемом более 4 ГБ на 32-разрядных процессорах, диапазон физических адресов разделен на окна по 1 ГБ, которые по одному отображаются в окно виртуальной памяти. Каждое окно размером 1 ГБ может содержать одну или несколько смежных областей памяти. В большинстве тестов проверка выполняется поочередно для каждой области памяти. Кэширование включено для всех тестов, кроме первого.
В каждой области памяти по очереди тестируются все биты адреса, используя шаблон адреса «ходячие единицы». Ошибки этого теста не влияют на шаблоны BadRAM, области памяти или плохие области страниц.
В каждую область памяти поочередно каждый адрес записывается своим адресом и затем каждый адрес проверяется на согласованность. Этот тест выполняется последовательно для каждого доступного ЦП, независимо от режима последовательности ЦП, выбранного пользователем.
Во всех областях памяти каждый адрес записывается со своим собственным виртуальным адресом плюс номер окна (для 32-битных изображений) или собственный физический адрес (для 64-битных изображений), а затем каждый адрес проверяется на согласованность. Это улавливает любые ошибки в старших битах адреса, которые могут быть пропущены при поочередном тестировании каждого окна. Этот тест выполняется последовательно для каждого доступного ЦП, независимо от режима последовательности ЦП, выбранного пользователем.
В каждой области памяти по очереди и для каждого шаблона по очереди используется алгоритм скользящей инверсии с шаблонами, состоящими из всех единиц и всех нулей.
В каждой области памяти по очереди и для каждого шаблона поочередно используется алгоритм скользящих инверсий с шаблонами шагающих единиц шириной 8 бит и ходячих нулей.
В каждой области памяти по очереди и для каждого шаблона по очереди используется алгоритм скользящей инверсии с шаблонами случайного числа и его дополнения. Случайное число различается при каждом проходе теста, поэтому несколько проходов повышают эффективность.
В каждой области памяти по очереди и для каждого шаблона по очереди используется алгоритм скользящей инверсии с шаблонами шириной 32 бита (в 32-битных сборках) или шириной 64 бита (в 64-битных сборках) ходячих единиц и ходячих нулей. . В отличие от предыдущих тестов, шаблон поворачивается на 1 бит для каждого последующего адреса.
Этот тест нагружает память с помощью инструкций перемещения блоков (movs) и основан на тесте BurnBX Роберта Редельмайера.
В свою очередь, в каждой области памяти память инициализируется с помощью шаблонов сдвига, которые инвертируются каждые 8 байт. Затем блоки памяти перемещаются с помощью инструкции movs. После завершения ходов проверяются закономерности данных. Поскольку данные проверяются только после завершения перемещения памяти, невозможно узнать, где произошла ошибка. Указанные адреса относятся только к тем местам, где был обнаружен неверный шаблон. Как следствие, ошибки этого теста не влияют на шаблоны BadRAM, области памяти или плохие области страниц.
В каждую область памяти по очереди записывается каждый адрес со случайным числом, затем каждый адрес проверяется на согласованность и записывается дополнением исходных данных, затем каждый адрес снова проверяется на согласованность.
В каждой области памяти по очереди и для каждого шаблона поочередно используется алгоритм Modulo-20 с шаблонами случайного числа и его дополнения. Случайное число различается при каждом проходе теста, поэтому несколько проходов повышают эффективность.
Во всех областях памяти и для каждого шаблона поочередно инициализирует каждую ячейку памяти шаблоном, приостанавливает работу на определенный период времени, а затем проверяет каждую ячейку памяти на согласованность. Тест выполняется с шаблонами, состоящими из всех нулей и всех единиц.
Ознакомьтесь со списком открытых проблем и запросов на улучшения на GitHub.
Не стесняйтесь присылать отчеты об ошибках!
Приветствуется участие в коде как для исправления ошибок, так и для внесения улучшений. Некоторые основные рекомендации см. в README_DEVEL.md в каталоге doc.
Memtest86+ v6.0 был основан на PCMemTest, разработанном Мартином Уитакером, который был основан на Memtest86+ v5.01, разработанном Сэмюэлем Демельмейстером, который, в свою очередь, был основан на Memtest86, разработанном Крисом Брэди с ресурсами и помощью, перечисленными ниже:
Первоначальные версии исходных файлов bootsect.S, setup.S, head.S и build.c взяты из ядра Linux 1.2.1 и были сильно модифицированы.
Дуг Сиск предоставил код для поддержки консоли, подключенной через последовательный порт. (в настоящее время не используется)
Код для создания шаблонов BadRAM предоставил Рик ван Рейн.
Тест перемещения блока основан на тесте burnBX Роберта Редельмайера.
Код экранного буфера предоставил Яни Авербах. (не используется Memtest86+ v6.0)
Эрик Бидерман предоставил все функциональные возможности версии 3.0, а также множество исправлений ошибок и значительную очистку кода.
Основные улучшения в обнаружении оборудования и создании отчетов в версиях 3.2, 3.3 и 3.4, предоставленные Сэмюэлем Демельмейстером (из Memtest86+ v1.11, v1.60 и v1.70).
Кроме того, несколько исправлений ошибок для Memtest86+ были импортированы из anphsw/memtest86.