Esecuzione di Windows con RAM difettosa


25

È possibile eseguire Windows (7, x64) con un modulo RAM difettoso? Più precisamente, c'è un modo per dire a Windows di non allocare un indirizzo errato noto o un blocco di indirizzi?

Per Linux, c'è BadRAM . Esiste un'implementazione esistente per Windows? È possibile anche con il kernel di Windows (NT 6.1)? Forse un driver in modalità kernel?


4
@ekaj Se fosse passata solo una settimana dall'acquisto, è possibile sostituirlo in garanzia? ;)
Bob

3
In realtà questa è l'idea più intelligente, è spezzata, costringili a risolverlo
Journeyman Geek

Risposte:


15

Bob, ci sono tre parti della tua domanda. Ne parlerò uno alla volta.

Esecuzione di Windows con memoria insufficiente

È infatti possibile eseguire Windows 7 con un modulo difettoso. A seconda della posizione dei settori danneggiati e di dove si trova il modulo nei banchi DIMM, Windows 7 funzionerà come se non ci fosse nulla fino a quando non tenta di toccare le parti danneggiate della memoria. Quindi, idealmente dovresti spostare il modulo difettoso il più lontano possibile dalla banca 0. Naturalmente, se questo è il tuo unico modulo, sei sfortunato.

Blocco dei settori di memoria difettosa in Windows

Sui sistemi operativi x86 (32 e 64 bit), la memoria è gestita dal kernel. Come accennato, BadMem è in grado di bloccare settori della memoria difettosa in Linux. Funziona dicendo al kernel di bloccare gli indirizzi di memoria specificati. Questo impedisce efficacemente a Linux di indirizzare mai quegli indirizzi durante l'allocazione (e la deallocazione) della memoria. Ma per fare ciò, BadMem deve patchare il kernel. BadMem non è altro che una patch del kernel configurata prima dell'applicazione.

Ora, non hai questa capacità su Windows. Non è possibile patchare il kernel. Lo sviluppo di un driver in modalità kernel non ti farà nulla di buono, dal momento che il kernel di Windows non permetterà mai al tuo driver di avere la precedenza sulla sua architettura di gestione della memoria (comprensibilmente).

Per questo motivo, non è possibile indicare a Windows in alcun modo di non utilizzare determinati indirizzi di memoria. L'unico modo sarebbe per Microsoft di applicare una patch specifica al kernel per il tuo caso. Improbabile.

La diffusione di indirizzi di memoria errati

Non ci sono molte ragioni per cui un modulo di memoria può contenere indirizzi errati. Alla fine, tutto si riduce a un errore nella linea di produzione, supponendo che non abbia subito danni prima di entrare nel tuo computer. Contrariamente ai dischi rigidi non ci sono parti mobili nei moduli di memoria, come ben sai. Quindi, i settori danneggiati non tendono a diffondersi come nel caso dei settori del disco rigido.

Tuttavia, il software di test della memoria non è infallibile. È possibile (e comune) che passi determinati indirizzi che in realtà sono cattivi. Quindi la cattiva memoria può dare l'impressione di "diffondersi" poiché sempre più indirizzi si rivelano essere cattivi. Per questo motivo strumenti come BadMem rivelano la loro debolezza, perché naturalmente possono solo gestire quegli indirizzi a cui li istruisci.

È improbabile che chiunque possa condurre un test approfondito di un modulo di memoria e identificare tutti gli indirizzi di memoria danneggiati, quindi bloccarli e finire con un "buono" modulo di memoria. La cosa più semplice da fare è considerare un modulo con indirizzi errati come un modulo difettoso e di conseguenza non fidarsi.

Ciò significa che, per quanto BadMem sia una proposta interessante, in realtà non è una soluzione al problema della cattiva memoria. Molto probabilmente, non finirai comunque con un sistema operativo che tenta di leggere un settore danneggiato e si blocca con un errore di arresto. Un modulo errato è un modulo errato è un modulo errato.


Ci sono alcune buone risposte, ma accetterò questo per dare una buona ragione per non farlo. Si può dire al kernel di Windows di non usare oltre un certo indirizzo, come altri hanno notato, ma quando l'errore si trova nel mezzo dello spazio degli indirizzi è come usare un'ascia quando si desidera uno scapel ... si desidera un controllo più preciso ma, apparentemente impossibile. È un peccato.
Bob,

8
Non del tutto corretto; esso è possibile indicare a Windows per evitare determinati indirizzi (più precisamente, alcuni numeri di pagina in frame). La funzionalità è progettata per la memoria ECC, con la quale Windows può rilevare possibili guasti e contrassegnare quelli PFN come non validi, ma è possibile aggiungere manualmente i PFN all'elenco: superuser.com/a/490522/117590 - semplicemente non molto pratico. Quindi, sì, la sostituzione rimane l'opzione migliore: P
Bob,

17

Il BCD di Windows (dati di configurazione di avvio) ha effettivamente un {badmemory}oggetto. Sembra che qui vengano elencati gli indirizzi di memoria "previsti per il fallimento" dalla memoria ECC e non utilizzati dal sistema operativo.

L' {badmemory}oggetto accetta un elemento BadMemoryList(tipo BCD 0x1700000a), che è un elenco di numeri interi che possono essere inseriti come esadecimali, separati da spazi. Immagino che sarebbe possibile inserire manualmente indirizzi di memoria errata come trovato da memtest86 in questo elemento, ma non l'ho provato. Apparentemente, accetta i numeri di frame della pagina, che è l'indirizzo effettivo diviso per 4096. Sfortunatamente, questi indirizzi / PFN potrebbero non corrispondere a quelli riportati dalla diagnostica della memoria. La modifica manuale può essere eseguita con Visual BCD Editor .

In ogni caso, le memory stick difettose devono essere sostituite come indicato dalle altre risposte. Questa è solo una nota su un possibile modo per aggirare il problema (temporaneamente?).


Un tutorial meglio formattato di tutto ciò che hai detto è disponibile qui . Bel lavoro, comunque.
mirh,

13

Windows BCD ha {badmemorylist}e {badmemoryaccess}oggetti. È necessario impostare il primo su pagine di memoria errata separate da spazi (ad es. bcdedit /set badmemorylist 1499543 1434007) E il secondo su No( bcdedit /set badmemoryaccess No)

Ricorda che le dimensioni della pagina di memoria in Windows di solito 4KB

Testato su Windows 7 e funziona bene

Puoi testare le tue impostazioni tramite Rammap di Sysinternals

PS Ho ricevuto queste informazioni da "Windows Internals Book" chapter 10


13

Ho avuto problemi di RAM in un tablet con SoC. La memoria è saldata o integrata nel SoC e non può essere sostituita.

Sono in Argentina e il venditore è in Cina, e le spese di spedizione e il tempo, non ha senso inviare in garanzia.

Sono riuscito a fare qualche colpo.

La chiave per passare i parametri di memoria danneggiati sono:

  1. gli indirizzi in memtest86 corrispondono agli indirizzi utilizzati in Windows.
  2. deve contrassegnare le pagine complete di 4KBytes.
  3. in memtest 0x10000000corrisponde a 0x10000 in Windows
  4. in memtest 0x00001000corrisponde a 0x1 in Windows
  5. significa: il numero di pagina in Windows rimuove gli ultimi 3 numeri esadecimali da memtest.
  6. significa che: windows elimina gli zeri a sinistra.
  7. considerare 5 e 6, per evitare errori nei numeri di pagina.
  8. l'istruzione corretta è: bcdedit /set {badmemory} badmemorylist 0xB7 0xB8 0xB9 0xBAagli errori nel memtest da 0x000B7000 a 0x000BAFFF. Nota che non puoi mettere una serie di memorie, ma tutte le pagine una per una
  9. impossibile aggiungere pagine, tutte le pagine devono essere contrassegnate con lo stesso comando. Se una nuova pagina, aggiunge sovrascrive più vecchi. Sono riuscito ad aggiungere 4096 pagine in un unico comando. Non l'ho provato più.
  10. bcdedit /enum {badmemory}, mostra l'elenco delle pagine contrassegnate.
  11. bcdedit /set badmemoryaccess no impedire l'utilizzo delle pagine contrassegnate
  12. è necessario riavviare dopo aver contrassegnato le pagine e rimuovere l'accesso.

1
Ho dovuto rimuovere lo spazio bianco tra il /comando e per farlo funzionare, quindi invece bcdedit / enum {badmemory}sarà lo bcdedit /enum {badmemory}stesso per gli altri
flagg19

Funziona, ma sfortunatamente il limite di cmd su Windows è limitato a 8191 e non sono stato in grado di bloccare tutte le pagine di memoria difettosa. Non sono riuscito a trovare una buona soluzione per risolvere questo problema. C'è un modo per registrare l'intervallo di pagine? Dovrei bloccare tutte le pagine da 0x714bc8 a 0x71cbd0 che sono troppe pagine! Cosa ho fatto, quindi? Ho eseguito il test più semplice (# 0 e # 1) e ho ottenuto un intervallo più limitato di errori di memoria. Funziona bene finora, niente più schermate blu. Ma so di non aver bloccato tutto ciò che sarebbe stato necessario.
Felipe,

3

Per quanto ne so, l'unico modo per farlo è utilizzare il comando BurnMem che può limitare artificialmente la quantità di RAM utilizzata da Windows.


2
Hmm .. questa è un'opzione interessante. Forse maxmem, poiché apparentemente burnmemnon limita il massimo indirizzo fisico mentre lo maxmemfa. L'equivalente di Vista e 7 sarebbe truncatememory. Sebbene questa sia una possibile soluzione, esiste un metodo più preciso per i casi in cui la memoria difettosa si trova nel mezzo o all'inizio dello spazio degli indirizzi e blocca tutto dopo che non è desiderato?
Bob

@Bob - Il motivo per cui non puoi semplicemente sostituire la modesta memoria difettosa è perché?
Ramhound,

@Ramhound Potrei, se volessi. Ma ciò richiederebbe tempo. In questo momento, sto correndo con metà della mia memoria originale, non eccezionale per le mie VM. Ottenere un modulo nuovo o sostitutivo che funzionerebbe effettivamente potrebbe richiedere alcune settimane. Se una soluzione software mi permettesse di farlo in due ore o meno, lo considererei tempo ben speso e qualcosa di nuovo appreso. Accetterei questa risposta (la mia memoria è fallita proprio alla fine dello spazio degli indirizzi) ma se qualcuno ha una soluzione più versatile preferirei quella per riferimento futuro.
Bob,

@Bob - Dopo averlo letto abbastanza ampiamente, sembra che non sia possibile. Questo perché BadRam utilizza memtest per indicare al kernel di escludere indirizzi errati dal bootloader, Windows non è in grado di farlo poiché attualmente non esiste alcun modo per determinare quali indirizzi errati escludere nello stesso modo in cui un kernel con patch BadRam può .
Oliver G,

3

Guarda questo util: https://github.com/prsyahmi/BadMemory

È molto facile da usare e supporta il blocco degli intervalli di indirizzi. E puoi utilizzare l'indirizzo completo ricevuto da MemTest86 senza rimuovere le ultime tre cifre.


2

ATTENZIONE!!! Windows potrebbe non avviarsi, sii pronto a ricostruire il BCD. In tal caso, utilizzare il Prompt dei comandi in Opzioni di avvio avanzate. Non so perché non si avvierà più, sembra accadere casualmente o se inserisci troppi indirizzi nella lista dei ricordi.

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

Heres un comando C ++ prompt dei Programm che ottiene un elenco indirizzo di memoria continuo in un file .txt pronto per bcdedit /set badmemorylisto bcdedit /set {badmemory} badmemorylist(non ha funzionato su Win7 per me)

Utilizzare bcdedit /set badmemoryaccess 0per negare l'accesso.

È possibile verificare con EasyBCD in Visualizza impostazioni -> Dettagli. Dopo un riavvio, verificare con Rammap se lo spazio degli indirizzi fisici è svanito.

#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

Sì. Esistono parametri di avvio per controllare la quantità di memoria che Windows può utilizzare. Tuttavia, è possibile rimuovere solo dalla fine dello spazio di memoria. Vedi questo articolo msdn per controllare i parametri di avvio. I parametri di interesse sono truncatememorye removememory.


Troncare e rimuovere la memoria sembra solo tagliare l'accesso alla RAM (a partire da una data tre volte, o lavorando all'indietro dalla fine). Questa domanda riguardava soprattutto la fornitura di intervalli.
mirh,

0

Potresti provare questa funzione in Windows 7, ma non sono sicuro di quale chip avrà effetto, o se scremerà la stessa quantità da ciascuno di essi. Dovrò guardarmi intorno per scoprirlo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.