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?
Odpowiedzi:
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ł.
źródło
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 akceptujeBadMemoryList
(typ BCD0x1700000a
) 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?).
źródło
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ą naNo
(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
źródło
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ą:
0x10000000
odpowiada 0x10000 w Windows0x00001000
odpowiada 0x1 w Windowsbcdedit /set {badmemory} badmemorylist 0xB7 0xB8 0xB9 0xBA
na błędy w memtest od 0x000B7000 do 0x000BAFFF. Pamiętaj, że nie możesz umieścić szeregu wspomnień, ale wszystkie strony jedna po drugiejbcdedit /enum {badmemory}
, pokazuje listę zaznaczonych stron.bcdedit /set badmemoryaccess no
zapobiec wykorzystywaniu zaznaczonych stronźródło
/
i poleceniem, aby zadziałało, więc zamiastbcdedit / enum {badmemory}
tego będzie takbcdedit /enum {badmemory}
samo dla innychO 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.
źródło
maxmem
, ponieważ najwyraźniejburnmem
nie ogranicza to maksymalnego adresu fizycznegomaxmem
. Byłaby to wersja Vista i 7truncatememory
. 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?Spójrz na to wykorzystanie: https://github.com/prsyahmi/BadMemory
Jest bardzo łatwy w użyciu i obsługuje blokowanie zakresów adresów. I możesz użyć pełnego adresu otrzymanego z MemTest86 bez usuwania ostatnich trzech cyfr.
źródło
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.
Oto wiersz polecenia C ++ Programm, który pobiera listę adresów ciągłej pamięci w pliku .txt gotowy dla (
bcdedit /set badmemorylist
lubbcdedit /set {badmemory} badmemorylist
nie działał na Win7 dla mnie)Służy
bcdedit /set badmemoryaccess 0
do 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.
źródło
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ą
truncatememory
iremovememory
.źródło
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ć.
źródło