Jak umieścić na czarnej liście prawidłowy uszkodzony sektor pamięci RAM zgodnie ze wskazaniem błędu MemTest86 +?

28

MemTest86 + (wersja dołączona do Ubuntu 13.04) mówi

Failing address: 002f796c48 -    759.5 MB

Co powinienem określić w memmapparametrze jądra, aby ominąć ten obszar?

Próbowałem uruchomić memtester 770MBi mówi, że wszystko jest w porządku, więc nie wygląda na to, że wskazania MemTest oznaczają błąd w 759,5 MB od samego początku.

Jak interpretować to wskazanie MemTest, aby skonfigurować memmap?

Nie mam teraz pieniędzy na zakup nowej pamięci RAM, a błąd wydaje się być pojedynczy, więc mam nadzieję, że mogę go zastąpić.

Ivan
źródło
FWIW, jądro oznaczy niektóre strony jako „zarezerwowane”, jeśli wykryje zły segment, ale jest w stanie go odzyskać. Czy wyjście „free -m” pokazuje potęgi dwóch dla sum? Wspominam o tym, aby wyjaśnić, dlaczego memtester nie widzi złej pamięci RAM, ale memtest86 + może.
Bratchley,
Właściwie nie wygląda to na potęgę dwóch: i.stack.imgur.com/l86L1.png
Ivan
Do czasu wykrycia błędu (nawet jeśli masz ramkę ecc), jest na ogół za późno. Również free -m nigdy nie zgłasza parzystej potęgi dwóch, ponieważ zarówno bios, jak i jądro rezerwują trochę pamięci RAM.
psusi
1
Marzę, aby kupić laptopa ECC, ale nigdy nie mogłem znaleźć żadnych dostępnych ofert, wygląda na to, że nie istnieją.
Ivan
Wygląda na to, że jądro również drukuje, gdy znajdzie złą stronę (linia 264-265).
Bratchley,

Odpowiedzi:

26

memmap

Jest ten samouczek zatytułowany: Zła pamięć HowTo, który omawia wyłączanie pamięci przez jądro za pomocą memmapargumentu do jądra. Zgodnie z howto masz 2 opcje, jeśli chodzi o memmap:

  • Wyłącz wszystko po złej pamięci - (mem=###M option)
  • Wyłącz tylko pamięć wokół złej pamięci - (memmap=#M$###M option)

W przypadku pierwszej opcji, jeśli memtest zgłosi, że pamięć ma 600 m pamięci, możesz wyłączyć pamięć RAM od tego momentu aż do końca pamięci RAM w ten sposób:

 mem=595M

Jeśli jest zła pamięć RAM przy 802M i 807M, możesz wyłączyć sekcję 10M RAM zaczynając od 800M w następujący sposób:

memmap=10M$800M

UWAGA: Spowoduje to umieszczenie na czarnej liście 10M po adresie podstawowym 800M. memtest86+Następnie należy uruchomić, aby potwierdzić, że ten argument jest poprawny.

BadRAM

Dla Ubuntu dostępna jest łatka o nazwie BadRam. Jest bardzo dobrze omówione w tym poście zatytułowanym: BadRAM na stronie społeczności Ubuntu.

Po zastosowaniu łaty do jądra przy użyciu szczegółów z tej strony wprowadzasz zmiany w konfiguracji Grub2:

fragment z tej strony dla Grub2

Plik konfiguracyjny GRUB2 w Natty zawiera wiersz służący do konfigurowania wykluczeń złych pamięci RAM jądra. Zakładam więc, że jest to preferowany sposób mapowania części pamięci, w której wyświetlane są błędy. Ustawiłem linię

GRUB_BADRAM = "0x7DDF0000,0xffffc000"

Sugerowanym sposobem na każdej stronie internetowej, jaką mogłem znaleźć, było ustawienie memtest86 i pokazanie ustawień BadRAM. memtest86 dał mi stronę z materiałami, do których musiałbym wejść. Widziałem, że wszystkie adresy były w jednym bloku 16K, więc chciałem po prostu zmapować ten blok 16K z działania. Oto jak wygenerowałem poprawny wpis.

Pierwszy parametr jest łatwy. To jest podstawowy adres złej pamięci. W moim przypadku widziałem, że wszystkie złe adresy były większe niż 0x7DDF0000 i mniejsze niż 0x7DDF4000. Tak więc jako adres początkowy wziąłem początek bloku 16K.

Drugi parametr to maska. Wstawiasz jedynki, w których zakres adresów ma takie same wartości, a jedynki, gdzie będą się różnić. Oznacza to, że musisz wybrać zakres adresów tak, aby różniły się tylko bity niskiego rzędu. Patrząc na mój adres, pierwsza część maski jest łatwa. Chcesz zacząć od 0xffff. Do następnego kęsa wyjaśnię mapami bitowymi. Chcę mieścić się w zakresie od 0000 do 0011. Zatem maska ​​dla badramu wynosiłaby 1100 lub heks c. Ostatnie 3 skrypty muszą mieć w masce wszystkie zera, ponieważ chcemy zmapować cały zakres. Tak więc otrzymujemy całkowity wynik 0xffffc000.

Po ustawieniu tej linii w / etc / default / grub, uruchomiłem sudo update-grub i zrestartowałem i moja zła pamięć nie była już używana. Żadne poprawki jądra nie są potrzebne do mapowania złej pamięci przy użyciu tej metody.

Kontynuacja # 1

Przeglądając stronę wikipedia dla memtest86 +, czytamy:

fragment strony Wikipedii Memtest86

Począwszy od Memtest86 2.3 i Memtest86 + 1.60, program może wypisać listę uszkodzonych regionów RAM w formacie oczekiwanym przez łatkę BadRAM dla jądra Linux; wykorzystując te informacje, system Linux może niezawodnie korzystać z modułu pamięci RAM, nawet jeśli ma kilka wadliwych bitów. Grub2 jest w stanie dostarczyć te same informacje do niezałatowanego jądra, co eliminuje potrzebę łatki BadRAM.

Natknąłem się również na tę stronę Gentoo, w której podano memmap=...adres heksadecymalny, więc możesz podać go następująco:

memmap=5M$0x2f796c48

5M to tylko przypuszczenie, oczywiście możesz dostosować go niżej lub wyżej, w zależności od ilości pamięci RAM w tym regionie, którą chcesz / musisz pominąć.

Na koniec możesz również określić rozmiar szesnastkowy:

memmap=0x10000$0x2f796c48

Zignoruje 64KB zaczynające się pod adresem 0x2f796c48.

Referencje

slm
źródło
„800–804 mln” ma być „800–810 mln”. Zakładam, że ...
Hauke ​​Laging
Może być, ale to, co napisałem, jest również OK, mimo że wyrzuca więcej pamięci niż 4M pomiędzy 800M a 810M.
slm
1
1. Wiem o tej memmapopcji, ale pytanie dotyczy bardziej, jak interpretować wynik memtest86 +. Podałem konkretny przykład wyjścia memtest86 + i proszę o pomoc w memmap odpowiedniej konfiguracji w tym konkretnym przypadku. 2. „Następnie należy uruchomić memtest86 +, aby potwierdzić, że ten argument jest poprawny”. - memtest86 + działa przed jądrem systemu operacyjnego, więc poważnie wątpię, aby memmapopcja jądra Linuksa mogła na to wpłynąć.
Ivan
@Ivan, 1. Wydawało mi się, że to oczywiste, biorąc pod uwagę przykłady, które załączyłem, ale musisz powiedzieć coś takiego: memmap=5M$759Mw twoim konkretnym przypadku, biorąc pod uwagę, że memtest86 + nie działa z 759,5 MB. 2. Miałem na myśli, że powinieneś również przekazać memmap=...opcję memtest86 +. To było przeze mnie niepotwierdzone / niepotwierdzone, ale coś, co możesz zrobić z memtest86 +.
slm
1
Ok dzięki. Nie byłem pewien, co oznacza „002f796c48 - 759,5 MB” (być może może to być 759,5 megabajta po adresie 002f796c48 lub coś w tym rodzaju) i nigdy nie podejrzewałem, że mogę przekazać parametry jądra Linuksa do MemTest86 + (myślałem, że to nic nie znaczy zrobić z Linuksem).
Ivan
14

Memtest86 + (użyłem 4.20) może bezpośrednio wyprowadzić format badram.

  1. Naciśnij „c”, aby przejść do okna konfiguracji dialog konfiguracji memtest

  2. Następnie „4” dla „Tryb raportu o błędzie”

    dialog trybu raportowania błędów memtest

  3. Następnie „3” dla „BadRAM Patterns”

Dane wyjściowe zmienią się z listy pojedynczych niepowodzeń testu na serię linii badram =, z których każda zawiera jeszcze jeden zły sektor. Ponieważ linie łączą się i łączą sąsiednie segmenty, możesz po prostu uruchomić test bezgłowy przez noc i użyć ostatniej wydrukowanej linii (chociaż jeśli masz naprawdę zły dimm, mniej dokładny format „5 megawatów wokół tego punktu” prawdopodobnie będzie nieco krótszy ).

Ostateczny wynik:

Memtest86 + pokazuje wyjście badramu

skorgu
źródło
4
Teraz, gdybym nie musiał kopiować tego ręcznie i zamiast tego przekazywać go do GRUB-a bez ponownego wpisywania błędów, byłoby to fantastyczne.
Ehtesh Choudhury
8
Zrobiłem to zdjęcie (telefon z aparatem), załadowałem do GIMP, => skala szarości => odwróć => kontrast / gamma, a następnie podałem tesseract ${IMG} stdout... następnie zweryfikowałem i poprawiłem linię przed wstawieniem do / etc / default / grub ... Prawdopodobnie zajęło to tak długo, jak ręczne wprowadzenie od razu ^^
eMPee584
3
Zdecydowanie więcej zabawy niż robienie tego ręcznie
latanie owiec