Czy pamięć testowa memtest86 + służy do uruchamiania się?

65

Jednym z typowych scenariuszy awarii serwera jest zła pamięć DRAM, czasami nawet gdy używana jest pamięć ECC.

memtest86+jest jednym z najbardziej przydatnych narzędzi do diagnozowania problemów z pamięcią DRAM. Gdy ładuje się na początku pamięci, zastanawiałem się, czy memtest86+sprawdza część memtest86+załadowanej pamięci .

Czy pamięć jest przydzielona do memtest86+tak małej, że nie ma to znaczenia, czy też memtest86+może brakować usterki pamięci DRAM, ponieważ nie może ona przetestować lokalizacji pamięci, w których się znajduje?

Rudzik
źródło
8
Chociaż to pytanie dotyczy serwera, dotyczy ono również zwykłego komputera, dlatego głosowałem za przeniesieniem tego pytania do superużytkownika, z którego może dotrzeć do większej liczby osób.
Cristian Ciupitu

Odpowiedzi:

78

Oczywiście memtest86 + nie może przetestować obszaru pamięci, który obecnie zawiera kod wykonywalny memtest86 + (ale jeśli w tym regionie występują błędy pamięci, bardzo prawdopodobne jest, że sam test się zawiesi). Jednak memtest86 + jest w stanie przenieść swój własny kod na inny adres w czasie wykonywania, a za pomocą tej sztuczki jest w stanie przetestować całą pamięć, z której może korzystać oprogramowanie układowe (BIOS) - po prostu nie wszystkie naraz.

To przeniesienie kodu opisano w README.background w archiwum kodu źródłowego memtest86 + (plik jest nieco nieaktualny - np. Stwierdza, że ​​adresy użyte dla kodu memtest86 + to 0x2000 i 0x200000, ale niski adres zdefiniowany w źródle to faktycznie 0x10000, a wysoki adres to 0x2000000 lub 0x300000 w zależności od ilości pamięci w urządzeniu).

Ale nawet przy tej sztuczce relokacyjnej memtest86 + nie jest w stanie przetestować całej pamięci z następujących powodów:

  • Zazwyczaj oprogramowanie układowe (BIOS) rezerwuje niektóre regiony pamięci RAM do własnego użytku (np. Tabele ACPI). Chociaż do tych regionów pamięci RAM można uzyskać dostęp przez procesor, zapisanie w nich czegokolwiek może spowodować nieprzewidziane zachowanie.

  • Część pamięci RAM jest używana w trybie zarządzania systemem i nie jest nawet dostępna z procesora poza uprzywilejowanym kodem SMM.

  • Zakres adresów pamięci RAM od 640K do 1M jest niedostępny z powodu dziwaczności starszego układu pamięci komputera (część tej pamięci RAM może być używana jako cień dla BIOS ROM i SMM, inne części mogą być całkowicie niedostępne).

Siergiej Własow
źródło
1
Co ciekawe, brakowało mi możliwości przeniesienia. Oczywiście SMM i podobne są poza zasięgiem (poza konkretną obsługą BIOS-u).
shodanshok
Te zmapowane regiony generalnie wykluczają DRAM, ponieważ coś innego „poza modułem” jest adresowane? Mówią ROM i urządzenia peryferyjne.
mckenzm
3
jeśli masz kilka modułów pamięci RAM, przeprowadź drugi test po ich
zamianie
Czy możliwe jest uszkodzenie pamięci we właściwy sposób, aby memtest niepoprawnie zgłosił sukces z powodu przepisania instrukcji? A raczej ile błędów to zajmuje?
John Dvorak
3
@JanDvorak: Teoretycznie jest to oczywiście możliwe. W praktyce powiedziałbym, że jest to tylko trochę bardziej prawdopodobne niż uderzenie głową w klawiaturę i losowe wpisanie sonetu Szekspira.
Ilmari Karonen
5

Nie, memtest nie może przetestować własnej pamięci. Jest jednak tak mały (tylko niektóre KB), że nie ma większego znaczenia. EDYCJA: to stwierdzenie jest błędne, ponieważ, jak stwierdzono w wybranej odpowiedzi, memtest może dynamicznie przemieszczać się w celu przetestowania całej pamięci adresowanej przez użytkownika.

-

Teoretycznie nowoczesny procesor może w czasie rozruchu konfigurować część pamięci podręcznej jako pamięć programowalną, z bardzo małych programów (jako memtest) można uruchomić bez dotykania pamięci DRAM.

Jest to jednak funkcja specyficzna dla modelu (która wymaga obsługi systemu BIOS) i nie sądzę, że korzysta z niej memtest.

Shodanshok
źródło
Dziękuję za Twoją odpowiedź. memtesttestuje również pamięć podręczną procesora. Więc jeśli memtestzostanie załadowany do tej pamięci podręcznej, to nie można przetestować tej części pamięci podręcznej, co jest bardziej problematyczne, ponieważ jest znacznie mniejsze niż pamięć?
Robin
2
Biesiedź na dokumentacji Memtest86 to jednak nie testować cache procesora, przynajmniej w sposób bezpośredni. Ponadto nowoczesne procesory mają osobne instrukcje i pamięć podręczną danych (I $ i D $). Kod wykonywalny jest ładowany do pamięci podręcznej instrukcji i nie można go bezpośrednio modyfikować / nadpisywać
shodanshok
1
memtest86 + zdecydowanie testuje pamięć podręczną procesorów, ale to nie ma znaczenia dla tego pytania. Jeszcze raz dziękuję za odpowiedź.
Robin
3
Jesteś tego pewien? Myślałem, że skopiował się gdzie indziej podczas testowania pamięci, w której normalnie żyje. Dlatego każdy test ma wolną część (większość pamięci) i naprawdę szybką część (mały fragment, w którym przechowywany jest kod / dane).
Peter Cordes
1
@DmitryGrigoryev: Ach dobrze .. więc nauczyłem się czegoś więcej :-) Fajne dzięki!
Robin