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


65

Один із поширених сценаріїв відмови сервера - це погана DRAM, іноді навіть при використанні пам'яті ECC.

memtest86+є одним із найкорисніших інструментів для діагностики проблем із DRAM. Оскільки він завантажується на початку пам’яті, мені було цікаво, чи memtest86+перевіряє ту частину пам’яті, в яку memtest86+завантажується.

Чи виділена пам'ять memtest86+настільки мала, що не має значення, чи можливо, вона memtest86+може пропустити дефект в DRAM, оскільки вона не може перевірити місця пам'яті, в яких вона мешкає?


8
Хоча це питання актуально для сервера, воно також актуально для звичайного ПК, тому я проголосував за перенесення цього питання до Super User, де воно може охопити більше людей.
Крістіан Цюпіту

Відповіді:


78

Очевидно, memtest86 + не може перевірити область пам'яті, яка наразі містить виконавчий код memtest86 + (але якщо в цьому регіоні є помилки пам’яті, велика ймовірність, що сам тест вийде з ладу). Однак memtest86 + здатний перенести власний код на іншу адресу під час виконання, і за допомогою цього фокусу він може перевірити всю пам'ять, якою дозволено використовувати прошивку (BIOS) - просто не всі відразу.

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

Але навіть з цим фокусом про переїзд memtest86 + не в змозі перевірити всю пам'ять з наступних причин:

  • Зазвичай прошивка (BIOS) резервує деякі регіони оперативної пам’яті для власного використання (наприклад, таблиці ACPI). Хоча до цих регіонів оперативної пам’яті можна отримати доступ до процесора, записування в них будь-чого може призвести до непередбачуваної поведінки.

  • Частина оперативної пам’яті використовується в режимі управління системою і навіть не доступна з процесора поза привілейованим кодом SMM.

  • Діапазон адрес ОЗУ між 640 К та 1 М недоступний через химерність застарілої компонування пам'яті ПК (частина цієї ОЗУ може використовуватися як тінь для BIOS ROM та для SMM, інші частини можуть бути абсолютно недоступними).


1
Цікаво, що я пропустив її можливість переїзду. Очевидно, SMM і подібні знаходяться поза діапазоном (крім специфічної підтримки BIOS).
shodanshok

Ці картографічні регіони взагалі виключають DRAM, оскільки вирішується щось інше "відключений модуль"? ПЗУ та периферійні пристрої кажуть.
mckenzm

3
якщо у вас є кілька модулів оперативної пам’яті, виконайте друге тестування, замінивши їх ...
JFL

Чи можливо помилка пам'яті тільки правильним способом, щоб мемтест неправильно повідомив про успіх через переписання його інструкцій? А точніше, скільки несправностей потрібно?
Іван Дворак

3
@JanDvorak: Теоретично це можливо, звичайно. На практиці я б сказав, що це лише дещо частіше, ніж стукати головою по клавіатурі та випадковим чином вводити шекспірівський сонник.
Ільмарі Каронен

5

Ні, memtest не може перевірити власну пам'ять. Однак він настільки малий (лише деякі КБ), що навряд чи має значення. EDIT: це твердження невірне, оскільки, як зазначено у вибраній відповіді, memtest може динамічно переїхати, щоб перевірити всю пам'ять, яку адресується користувачем.

-

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

Однак це особливість моделі (для якої потрібна підтримка BIOS), і я не думаю, що memtest використовує її.


Спасибі за вашу відповідь. memtestтакож тестує кеш процесора. Отже, якщо memtestб було завантажено в цей кеш, то це ця частина кешу не змогла би бути перевірена, що є більш проблематичним, оскільки він значно менший, ніж пам'ять?
Робін

2
Він, заснований на документації memtest86 , не перевіряє кеш процесора, принаймні прямо. Більше того, сучасні процесори мають окремі інструкції та кеш даних (I $ і D $). Виконавлений код завантажується в кеш-інструкцію, і його неможливо безпосередньо змінити / перезаписати
shodanshok

1
memtest86 + напевно перевіряє кеш даних процесора, але це не має значення для цього питання. Дякую ще раз за вашу відповідь.
Робін

3
Ви впевнені в цьому? Я думав, що він скопіював себе десь під час тестування пам’яті, в якій він зазвичай живе. Ось чому кожен тест має повільну частину (більша частина пам’яті) та дійсно швидку частину (крихітний біт, де зберігається його код / ​​дані).
Пітер Кордес

1
@DmitryGrigoryev: Ну гаразд .. тож я дізнався щось більше :-) Класно дякую!
Робін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.