System Windows z uszkodzoną pamięcią RAM


25

Czy można uruchomić system Windows (7, x64) z uszkodzonym modułem RAM? Mówiąc dokładniej, czy jest jakiś sposób, aby powiedzieć systemowi Windows, aby nie przypisywał znanego złego adresu lub bloku adresów?

W systemie Linux jest BadRAM . Czy istnieje istniejąca implementacja dla systemu Windows? Czy jest to w ogóle możliwe w przypadku jądra systemu Windows (NT 6.1)? Może sterownik trybu jądra?


4
@ekaj Jeśli był to tylko tydzień po zakupie, może wymienić go w ramach gwarancji? ;)
Bob

3
Właściwie to najmądrzejszy pomysł, jest zepsuty, każ im go naprawić
Journeyman Geek

Odpowiedzi:


15

Bob, twoje pytanie składa się z trzech części. Zajmę się pojedynczo.

System Windows ze złą pamięcią

Rzeczywiście możliwe jest uruchomienie systemu Windows 7 z uszkodzonym modułem. W zależności od lokalizacji uszkodzonych sektorów i miejsca, w którym moduł znajduje się w bankach DIMM, system Windows 7 będzie działał tak, jakby nic nie było, o ile nie spróbuje dotknąć złych części pamięci. Tak więc najlepiej byłoby, gdyby uszkodzony moduł odsunął się jak najdalej od banku 0. Oczywiście, jeśli jest to twój jedyny moduł, nie masz szczęścia.

Blokowanie uszkodzonych sektorów pamięci w systemie Windows

W systemach operacyjnych x86 (32 i 64 bity) pamięcią zarządza jądro. Jak wspomniałeś, BadMem może blokować uszkodzone sektory pamięci w Linuksie. Działa poprzez instruowanie jądra, aby zablokowało podane adresy pamięci. To skutecznie powstrzymuje Linuksa przed adresowaniem tych adresów podczas przydzielania (i zwalniania) pamięci. Ale aby to zrobić, BadMem musi załatać jądro. BadMem to nic innego jak łatka na jądro, którą konfigurujesz przed zastosowaniem.

Teraz nie masz takiej możliwości w systemie Windows. Nie można łatać jądra. Opracowanie sterownika trybu jądra też ci nie pomoże, ponieważ jądro systemu Windows nigdy nie pozwoli, aby sterownik miał pierwszeństwo przed architekturą zarządzania pamięcią (co zrozumiałe).

Z tego powodu nie można instruować systemu Windows w żaden sposób, aby nie używał określonych adresów pamięci. Jedynym sposobem jest łatanie jądra dla konkretnej sprawy przez Microsoft. Mało prawdopodobne.

Rozpowszechnianie złych adresów pamięci

Nie ma wielu powodów, dla których moduł pamięci może zawierać złe adresy. Ostatecznie wszystko sprowadza się do błędu na linii produkcyjnej, zakładając, że nie doznał obrażeń przed dostaniem się do komputera. Jak wiadomo, w przeciwieństwie do dysków twardych w modułach pamięci nie ma ruchomych części. Tak więc złe sektory nie mają tendencji do rozprzestrzeniania się, jak ma to miejsce w przypadku sektorów dysków twardych.

Jednak oprogramowanie do testowania pamięci nie jest niezawodne. Jest możliwe (i często) przekazywanie niektórych adresów, które są faktycznie złe. Zła pamięć może sprawiać wrażenie „rozprzestrzeniania się”, ponieważ coraz więcej adresów okazuje się złych. Z tego powodu narzędzia takie jak BadMem ujawniają swoją słabość, ponieważ naturalnie mogą obsłużyć tylko te adresy, które im polecisz.

Jest mało prawdopodobne, aby ktokolwiek mógł przeprowadzić dokładny test modułu pamięci i zidentyfikować wszystkie złe adresy pamięci, a następnie zablokować je i uzyskać „dobry” moduł pamięci. Najprościej jest uznać moduł ze złymi adresami za uszkodzony moduł i dlatego nie można mu ufać.

Oznacza to, że o ile BadMem jest atrakcyjną propozycją, w rzeczywistości nie stanowi rozwiązania problemu złej pamięci. Bardziej prawdopodobne jest, że nadal nie skończysz z systemem operacyjnym, który próbuje odczytać zły sektor i ulega awarii z błędem zatrzymania. Zły moduł to zły moduł to zły moduł.


Istnieje kilka dobrych odpowiedzi, ale zaakceptuję to, podając dobry powód, dlaczego tego nie robić. Jądro systemu Windows można nakazać, aby nie korzystał z określonego adresu, jak zauważyli inni, ale gdy błąd znajduje się w środku przestrzeni adresowej, to tak, jakbyś używał siekiery, gdy chcesz mieć klapę ... pożądana jest dokładniejsza kontrola, ale, najwyraźniej niemożliwe. Szkoda.
Bob

8
Niezupełnie poprawne; to jest możliwe, aby poinstruować system Windows, aby uniknąć pewnych adresów (dokładniej niektóre numery stron ramce). Ta funkcja jest przeznaczona dla pamięci ECC, dzięki której system Windows może wykryć ewentualne usterki i oznaczyć te PFN jako złe, ale można ręcznie dodać PFN do listy: superuser.com/a/490522/117590 - po prostu mało praktyczne. Tak, tak, wymiana pozostaje najlepszą opcją: P
Bob

17

BCD systemu Windows (dane konfiguracji rozruchu) faktycznie ma {badmemory}obiekt. Wygląda na to, że adresy pamięci „przewidywane na awarię” pamięci ECC zostaną tutaj wymienione i nie będą używane przez system operacyjny.

{badmemory}Przedmiotem akceptuje BadMemoryList(typ BCD 0x1700000a) element, który jest lista liczb, który może zostać wprowadzony w Hex, oddzielone od przestrzeni. Myślę, że byłoby możliwe ręczne wstawienie do tego elementu nieprawidłowych adresów pamięci znalezionych przez memtest86 - ale tego nie przetestowałem. Najwyraźniej akceptuje numery ramek strony, czyli rzeczywisty adres podzielony przez 4096. Niestety te adresy / PFN mogą nie zgadzać się z tymi zgłaszanymi przez diagnostykę pamięci. Ręczną edycję można wykonać za pomocą Visual BCD Editor .

W każdym razie wadliwe karty pamięci należy wymienić zgodnie z innymi odpowiedziami. Jest to jedynie notatka o możliwym sposobie obejścia problemu (tymczasowo?).


Lepiej sformatowany samouczek wszystkiego, co powiedziałeś, jest dostępny tutaj . Mimo wszystko niezła robota.
mirh,

13

Windows BCD ma {badmemorylist}i {badmemoryaccess}obiekty. Należy ustawić pierwszą na uszkodzoną stronę pamięci oddzieloną spacjami (np. bcdedit /set badmemorylist 1499543 1434007), A drugą na No( bcdedit /set badmemoryaccess No)

Należy pamiętać, że zwykle rozmiar strony pamięci w systemie Windows 4KB

Testowany w Windows 7 i działa dobrze

Możesz przetestować swoje ustawienia za pomocą Rammap by Sysinternals

PS Mam te informacje z "Windows Internals Book" chapter 10


13

Miałem problem z pamięcią RAM w tablecie z SoC. Pamięć jest spawana lub zintegrowana z SoC i nie można jej wymienić.

Jestem w Argentynie, a sprzedawca jest w Chinach, a koszty i czas wysyłki nie ma sensu wysyłać gwarancji.

Udało mi się kilka trafień.

Kluczem do przekazania uszkodzonych parametrów pamięci są:

  1. adresy w memtest86 pasują do adresów używanych w systemie Windows.
  2. musi zaznaczyć pełne strony 4KBytes.
  3. w memtest 0x10000000odpowiada 0x10000 w Windows
  4. w memtest 0x00001000odpowiada 0x1 w Windows
  5. oznacza: Numer strony w systemie Windows usuwa ostatnie 3 memtest liczby szesnastkowe.
  6. oznacza, że: Windows eliminuje zera po lewej stronie.
  7. rozważ 5 i 6, aby uniknąć błędów w numerach stron.
  8. poprawna instrukcja to: bcdedit /set {badmemory} badmemorylist 0xB7 0xB8 0xB9 0xBAna błędy w memtest od 0x000B7000 do 0x000BAFFF. Pamiętaj, że nie możesz umieścić szeregu wspomnień, ale wszystkie strony jedna po drugiej
  9. nie można dodawać stron, wszystkie strony powinny być oznaczone tym samym poleceniem. Jeśli nowa strona, dodaje, zastępuje starsze. Udało mi się dodać 4096 stron w jednym poleceniu. Nie próbowałem tego więcej.
  10. bcdedit /enum {badmemory}, pokazuje listę zaznaczonych stron.
  11. bcdedit /set badmemoryaccess no zapobiec wykorzystywaniu zaznaczonych stron
  12. po zaznaczeniu stron konieczne jest ponowne uruchomienie komputera i usunięcie dostępu.

1
Musiałem usunąć biały odstęp między /i poleceniem, aby zadziałało, więc zamiast bcdedit / enum {badmemory}tego będzie tak bcdedit /enum {badmemory}samo dla innych
flagg19

Działa, ale niestety limit cmd w systemie Windows jest ograniczony do 8191 i nie byłem w stanie zablokować wszystkich złych stron pamięci. Nie mogłem znaleźć dobrego rozwiązania tego problemu. Czy istnieje sposób na zapisanie zakresu stron? Powinienem zablokować wszystkie strony od 0x714bc8 do 0x71cbd0, co jest zbyt dużą liczbą stron! Co zrobiłem, więc? Przeprowadziłem najprostszy test (nr 0 i nr 1) i uzyskałem bardziej ograniczony zakres błędu pamięci. Do tej pory działa dobrze, nie ma już niebieskich ekranów. Ale wiem, że nie zablokowałem wszystkiego, co byłoby konieczne.
Felipe

3

O ile mi wiadomo, jedynym sposobem na zrobienie tego jest użycie komendy BurnMem, która może sztucznie ograniczyć ilość pamięci RAM używanej przez Windows.


2
Hmm .. to interesująca opcja. Być może maxmem, ponieważ najwyraźniej burnmemnie ogranicza to maksymalnego adresu fizycznego maxmem. Byłaby to wersja Vista i 7 truncatememory. Chociaż jest to możliwe rozwiązanie, czy istnieje bardziej precyzyjna metoda w przypadkach, w których uszkodzona pamięć znajduje się na środku lub na początku przestrzeni adresowej i blokuje wszystko, gdy nie jest pożądane?
Bob

@ Bob - Dlaczego nie możesz po prostu wymienić modułu złej pamięci?
Ramhound

@Ramhound Mógłbym, gdybym chciał. Ale to zajmie trochę czasu. Obecnie korzystam z połowy oryginalnej pamięci, co nie jest idealne dla moich maszyn wirtualnych. Uzyskanie nowego lub zastępczego modułu, który faktycznie działałby, może zająć kilka tygodni. Jeśli oprogramowanie pozwala mi to zrobić w ciągu dwóch godzin lub krócej, uważam, że to dobrze spędzony czas i czegoś nowego się nauczyłem. Zaakceptowałbym tę odpowiedź (moja pamięć zawiodła na końcu przestrzeni adresowej), ale jeśli ktoś ma bardziej wszechstronne rozwiązanie, wolałbym to w przyszłości.
Bob

@Bob - Po dokładnym przeczytaniu tego wydaje się, że nie jest to możliwe. Wynika to z faktu, że BadRam wykorzystuje memtest, aby poinstruować jądro, aby wykluczyło złe adresy z bootloadera, Windows nie jest w stanie tego zrobić, ponieważ obecnie nie ma sposobu, aby sprawdzić, które złe adresy należy wykluczyć w taki sam sposób, jak jądro łatane przez BadRam może .
Oliver G


2

UWAGA!!! System Windows może się nie uruchomić, być gotowy do przebudowania BCD. W takim przypadku użyj polecenia Promt w Zaawansowanych opcjach uruchamiania. Nie wiem, dlaczego się nie uruchamia, wydaje się, że dzieje się losowo lub jeśli umieściłeś zbyt wiele adresów na liście badmemorylist.

bootrec /rebuild bcd
bcdedit /export c:\bcdbackup
attrib c:\boot\bcd -h -r -s
ren c:\boot\bcd bcd.old
bootrec /rebuild bcd

Oto wiersz polecenia C ++ Programm, który pobiera listę adresów ciągłej pamięci w pliku .txt gotowy dla ( bcdedit /set badmemorylistlub bcdedit /set {badmemory} badmemorylistnie działał na Win7 dla mnie)

Służy bcdedit /set badmemoryaccess 0do odmowy dostępu.

Możesz to sprawdzić za pomocą EasyBCD w Ustawieniach widoku -> Szczegółowe. Po ponownym uruchomieniu za pomocą Rammap sprawdź, czy fizyczna przestrzeń adresowa zniknęła.

#include <cstdlib>
#include <iostream>
#include <fstream>

//converts hex into base10
unsigned long convertHexToIntBase10(char* inputHex)
{
    unsigned long hexValue = std::strtoul(inputHex, 0, 16);
    return hexValue;
}

int main(int argc, char* argv[])
{
    if(argc < 3){
        std::cerr << "Usage: MemoryPageListHex [Low Memory Adress] [High Memory Adress] in 4k Pages i.e. MemoryPageListHex 1bae50 1bb0e7 for 0x1bae50148 to 0x1bb0e7fe8" << std::endl;
        return 0;
    }
    auto lowAdr = convertHexToIntBase10(argv[1]);
    auto highAdr = convertHexToIntBase10(argv[2]);
    std::ofstream myfile;
    myfile.open ("MemoryAdress4k.txt");
    for (auto i=lowAdr; i<highAdr; i++){
        myfile << std::hex << "0x" << i << " ";
    }
    myfile.close();
    return 0;
}

1

Tak. Istnieją parametry rozruchowe, które kontrolują ilość pamięci, z której może korzystać system Windows. Możesz jednak usunąć tylko z końca obszaru pamięci. Zobacz ten artykuł msdn, aby kontrolować parametry rozruchu. Parametrami zainteresowania są truncatememoryi removememory.


Obcinanie i usuwanie pamięci wydaje się po prostu odcinać dostęp do pamięci RAM (zaczynając od danego progu lub pracując wstecz od końca). To pytanie dotyczyło bardziej podania zakresów.
mirh,

0

Możesz wypróbować tę funkcję w systemie Windows 7, ale nie jestem pewien, który układ będzie działał lub czy będzie zużywał tyle samo z każdego z nich. Będę musiał to rozejrzeć.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.