Windows mit defektem RAM ausführen

25

Ist es möglich, Windows (7, x64) mit einem defekten RAM-Modul auszuführen? Gibt es eine Möglichkeit, Windows anzuweisen, keine bekanntermaßen fehlerhaften Adressen oder Adressblöcke zuzuweisen?

Für Linux gibt es BadRAM . Gibt es eine vorhandene Implementierung für Windows? Ist das überhaupt mit dem Windows-Kernel (NT 6.1) möglich? Vielleicht ein Kernelmodustreiber?

Bob
quelle
4
@ekaj Wenn es nur eine Woche nach dem Kauf war, ersetzen Sie es vielleicht im Rahmen der Garantie? ;)
Bob
3
Eigentlich ist das die klügste Idee, es ist kaputt. Bring sie dazu, das Problem zu beheben
Journeyman Geek

Antworten:

15

Bob, deine Frage besteht aus drei Teilen. Ich werde nacheinander ansprechen.

Ausführen von Windows mit schlechtem Speicher

Es ist in der Tat möglich, Windows 7 mit einem defekten Modul auszuführen. Abhängig von der Position der fehlerhaften Sektoren und der Position des Moduls in Ihren DIMM-Bänken wird Windows 7 so ausgeführt, als gäbe es nichts, solange nicht versucht wird, die fehlerhaften Teile des Speichers zu berühren. Idealerweise sollten Sie das defekte Modul so weit wie möglich von Bank 0 entfernen. Wenn dies Ihr einziges Modul ist, haben Sie natürlich Pech.

Blockieren fehlerhafter Speichersektoren in Windows

Auf x86-Betriebssystemen (32 und 64 Bit) wird der Speicher vom Kernel verwaltet. Wie Sie bereits erwähnt haben, kann BadMem fehlerhafte Speichersektoren in Linux blockieren. Dies funktioniert, indem der Kernel angewiesen wird, die von Ihnen angegebenen Speicheradressen zu sperren. Dadurch wird Linux effektiv daran gehindert, diese Adressen beim Zuweisen (und Freigeben) von Speicher zu adressieren. Dafür muss BadMem den Kernel patchen. BadMem ist nichts anderes als ein Kernel-Patch, den Sie vor der Anwendung konfigurieren.

Jetzt haben Sie diese Fähigkeit nicht mehr unter Windows. Sie können den Kernel nicht patchen. Die Entwicklung eines Kernelmodustreibers wird Ihnen auch nichts nützen, da der Windows-Kernel Ihren Treiber (verständlicherweise) niemals vor seiner Speicherverwaltungsarchitektur Vorrang einräumen lässt.

Aus diesem Grund können Sie Windows in keiner Weise anweisen, bestimmte Speicheradressen nicht zu verwenden. Die einzige Möglichkeit für Microsoft wäre, den Kernel für Ihren Fall speziell zu patchen. Unwahrscheinlich.

Die Verbreitung von schlechten Speicheradressen

Es gibt nicht viele Gründe, warum ein Speichermodul fehlerhafte Adressen enthält. Letztendlich läuft alles auf einen Fehler in der Produktionslinie hinaus, vorausgesetzt, es wurde kein Schaden angerichtet, bevor Sie in Ihren Computer eingestiegen sind. Im Gegensatz zu Festplatten befinden sich in Speichermodulen bekanntlich keine beweglichen Teile. Schlechte Sektoren verbreiten sich also nicht, wie dies bei Festplattensektoren der Fall ist.

Speichertestsoftware ist jedoch nicht kinderleicht. Es ist möglich (und üblich), dass bestimmte Adressen übergeben werden, die tatsächlich schlecht sind. So kann ein schlechtes Gedächtnis den Eindruck einer "Ausbreitung" erwecken, da sich immer mehr Adressen als schlecht herausstellen. Aus diesem Grund offenbaren Tools wie BadMem ihre Schwäche, da sie natürlich nur mit den Adressen umgehen können, an die Sie sie weisen.

Es ist unwahrscheinlich, dass jemand einen gründlichen Test eines Speichermoduls durchführen und alle fehlerhaften Speicheradressen identifizieren kann, diese dann sperren und ein "gutes" Speichermodul erhalten kann. Am einfachsten ist es, ein Modul mit schlechten Adressen durchgehend als defekt zu betrachten und demzufolge nicht vertrauenswürdig zu sein.

Was dies bedeutet, ist, dass BadMem, so attraktiv es auch ist, in der Tat keine Lösung für das Problem des schlechten Gedächtnisses darstellt. Wahrscheinlicher ist es, dass Sie immer noch ein Betriebssystem haben, das versucht, einen fehlerhaften Sektor zu lesen, und mit einem Stoppfehler abstürzt. Ein schlechtes Modul ist ein schlechtes Modul ist ein schlechtes Modul.

Ein Zwerg
quelle
Es gibt einige gute Antworten, aber ich akzeptiere dies, um einen guten Grund anzugeben, warum dies nicht der Fall ist. Wie andere angemerkt haben, darf der Windows-Kernel eine bestimmte Adresse nicht überschreiten. Wenn sich der Fehler jedoch in der Mitte des Adressraums befindet, ist es wie bei der Verwendung einer Axt, wenn Sie eine Kapelle möchten. Eine genauere Steuerung ist jedoch erwünscht. anscheinend unmöglich. Es ist ein Jammer.
Bob
8
Nicht ganz richtig; Es ist möglich, Windows anzuweisen, bestimmte Adressen zu vermeiden (genauer gesagt, bestimmte Seitenrahmennummern). Die Funktionalität ist für ECC - Speicher entwickelt, mit dem Windows möglichen Fehlern erkennen und diese PFNs als schlecht markiert, aber es ist möglich, manuell PFNs zur Liste hinzufügen: superuser.com/a/490522/117590 - nur nicht sehr praktisch. Also, ja, Ersatz bleibt die beste Option: P
Bob
17

Die Windows-BCD (Boot Configuration Data) hat tatsächlich ein {badmemory}Objekt. Es scheint, dass Speicheradressen, die vom ECC-Speicher als "voraussichtlich fehlerhaft" eingestuft werden, hier aufgelistet und vom Betriebssystem nicht verwendet werden.

Das {badmemory}Objekt akzeptiert ein Element BadMemoryList(vom Typ BCD 0x1700000a), bei dem es sich um eine Liste von Ganzzahlen handelt, die durch Leerzeichen getrennt als Hex eingegeben werden können. Ich denke, es wäre möglich, fehlerhafte Speicheradressen, wie sie von memtest86 gefunden wurden, manuell in dieses Element einzufügen - aber ich habe dies nicht getestet. Anscheinend akzeptiert es Seitenrahmennummern, die die tatsächliche durch 4096 geteilte Adresse sind. Leider stimmen diese Adressen / PFNs möglicherweise nicht mit denen überein, die von der Speicherdiagnose gemeldet wurden. Die manuelle Bearbeitung kann mit Visual BCD Editor erfolgen .

In jedem Fall sollten fehlerhafte Speichersticks ersetzt werden, wie in den anderen Antworten angegeben. Dies ist lediglich ein Hinweis auf eine mögliche Lösung des Problems (vorübergehend?).

Bob
quelle
Ein besser formatiertes Tutorial von allem, was Sie gesagt haben, finden Sie hier . Trotzdem gute Arbeit.
Mirh
13

Windows BCD hat {badmemorylist}und {badmemoryaccess}Objekte. Sie sollten die erste auf fehlerhafte Speicherseiten setzen, die durch Leerzeichen (z. B. bcdedit /set badmemorylist 1499543 1434007) und die zweite auf No( bcdedit /set badmemoryaccess No) getrennt sind.

Denken Sie daran, dass die Speicherseitengröße in Windows normalerweise 4KB

Getestet in Windows 7 und es funktioniert gut

Sie können Ihre Einstellungen mit Rammap by Sysinternals testen

PS: Ich habe diese Informationen von "Windows Internals Book" chapter 10

Vyacheslav Dorzhiev
quelle
13

Ich hatte Probleme mit dem RAM eines Tablets mit SoC. Der Speicher ist geschweißt oder in den SoC integriert und kann nicht ersetzt werden.

Ich bin in Argentinien und der Verkäufer ist in China, und die Versandkosten und die Zeit, macht es keinen Sinn, Garantie einzusenden.

Ich habe ein paar Treffer geschafft.

Der Schlüssel zur Übergabe der beschädigten Speicherparameter sind:

  1. Adressen in memtest86 stimmen mit den in Windows verwendeten Adressen überein.
  2. muss ganze Seiten von 4KByte markieren.
  3. in memtest 0x10000000entspricht 0x10000 in Windows
  4. in memtest 0x00001000entspricht 0x1 in Windows
  5. bedeutet: Die Seitenzahl in Windows entfernt die letzten 3 memtest-Hexadezimalzahlen.
  6. bedeutet, dass: Windows Nullen in der linken Seite beseitigt.
  7. Beachten Sie 5 und 6, um Fehler bei den Seitenzahlen zu vermeiden.
  8. Die richtige Aussage lautet: bcdedit /set {badmemory} badmemorylist 0xB7 0xB8 0xB9 0xBAzu Fehlern in memtest von 0x000B7000 bis 0x000BAFFF. Beachten Sie, dass Sie nicht eine Reihe von Erinnerungen speichern können, sondern alle Seiten nacheinander
  9. Seiten können nicht hinzugefügt werden, alle Seiten sollten im selben Befehl markiert werden. Wenn eine neue Seite hinzugefügt wird, werden ältere überschrieben. Ich habe es geschafft, 4096 Seiten in einem einzigen Befehl hinzuzufügen. Ich habe es nicht mehr ausprobiert.
  10. bcdedit /enum {badmemory}, zeigt die Liste der markierten Seiten.
  11. bcdedit /set badmemoryaccess no verhindern, dass die markierten Seiten verwendet werden
  12. Nach dem Markieren der Seiten muss ein Neustart durchgeführt und der Zugriff entfernt werden.
jgustavo
quelle
1
Ich musste den Leerraum zwischen dem /und dem Befehl entfernen , damit es funktioniert, damit bcdedit / enum {badmemory}es bcdedit /enum {badmemory}für die anderen gleich ist
flagg19
Es funktioniert, aber leider ist das cmd-Limit unter Windows auf 8191 begrenzt und ich konnte nicht alle fehlerhaften Speicherseiten blockieren. Ich konnte keine gute Lösung finden. Gibt es eine Möglichkeit, den Seitenumfang aufzuzeichnen? Ich sollte alle Seiten von 0x714bc8 bis 0x71cbd0 blockieren, das sind zu viele Seiten! Was habe ich also gemacht? Ich habe den einfachsten Test (Nr. 0 und Nr. 1) ausgeführt, und es ist ein begrenzterer Bereich von Speicherfehlern aufgetreten. Bisher läuft es gut, keine Bluescreens mehr. Aber ich weiß, dass ich nicht alles blockiert habe, was nötig wäre.
Felipe
3

Soweit mir bekannt ist, besteht die einzige Möglichkeit darin, den Befehl BurnMem zu verwenden, mit dem die Menge der verwendeten RAM-Fenster künstlich begrenzt werden kann.

Oliver G
quelle
2
Hmm .. das ist eine interessante Option. Vielleicht maxmem, da anscheinend burnmemdie maximale physikalische Adresse dabei maxmemnicht begrenzt wird. Das Vista und 7 Äquivalent wäre truncatememory. Dies ist eine mögliche Lösung. Gibt es jedoch eine genauere Methode für Fälle, in denen sich der defekte Speicher in der Mitte oder am Anfang des Adressraums befindet und alles blockiert, nachdem dies nicht erwünscht ist?
Bob
@ Bob - Der Grund, warum Sie das schlechte Speichermodul nicht einfach ersetzen können, ist warum?
Ramhound
@Ramhound könnte ich, wenn ich wollte. Aber das würde Zeit brauchen. Im Moment arbeite ich mit der Hälfte meines ursprünglichen Speichers, was für meine VMs nicht gut ist. Die Anschaffung eines neuen oder eines Ersatzmoduls, das tatsächlich funktionieren würde, kann einige Wochen dauern. Wenn ich dies mit einer Softwarelösung in zwei Stunden oder weniger erledigen kann, halte ich es für sinnvoll, Zeit zu investieren und etwas Neues zu lernen. Ich würde diese Antwort akzeptieren (mein Gedächtnis versagte gerade am Ende des Adressraums), aber wenn jemand eine vielseitigere Lösung hat, würde ich diese für eine spätere Referenzierung vorziehen.
Bob
@Bob - Nachdem ich das gerade ziemlich ausführlich gelesen habe, scheint es, dass es nicht möglich ist. Dies ist darauf zurückzuführen, dass BadRam memtest verwendet, um den Kernel anzuweisen, ungültige Adressen vom Bootloader auszuschließen. Windows kann dies nicht ausführen, da es derzeit nicht möglich ist, die ungültigen Adressen auf dieselbe Weise wie bei einem mit BadRam gepatchten Kernel auszuschließen .
Oliver G
3

Schauen Sie sich dieses Util an: https://github.com/prsyahmi/BadMemory

Es ist sehr einfach zu bedienen und unterstützt das Blockieren von Adressbereichen. Und Sie können die von MemTest86 empfangene vollständige Adresse verwenden, ohne die letzten drei Ziffern zu entfernen.

osipxd
quelle
2

VORSICHT!!! Windows kann möglicherweise nicht gestartet werden und ist bereit, den BCD neu zu erstellen. Verwenden Sie in diesem Fall die Eingabeaufforderung unter Erweiterte Startoptionen. Ich weiß nicht, warum es nicht mehr bootet, zufällig passiert oder ob du zu viele Adressen in badmemorylist eingibst.

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

Hier ist ein C ++ - Eingabeaufforderungsprogramm, das eine Liste mit fortlaufenden Speicheradressen in einer TXT-Datei abruft, die für bcdedit /set badmemorylistoder bereit ist bcdedit /set {badmemory} badmemorylist(unter Win7 hat das bei mir nicht funktioniert).

Verwenden Sie bcdedit /set badmemoryaccess 0diese Option, um den Zugriff zu verweigern.

Sie können dies mit EasyBCD unter Ansichtseinstellungen -> Detailliert überprüfen. Überprüfen Sie nach einem Neustart mit Rammap, ob der physische Adressraum verschwunden ist.

#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;
}
Birnd
quelle
1

Ja. Es gibt Boot-Parameter, um die Größe des Arbeitsspeichers zu steuern, den Windows verwenden kann. Sie können jedoch nur vom Ende des Speicherbereichs entfernen. Weitere Informationen zum Steuern der Startparameter finden Sie in diesem MSDN- Artikel. Die interessierenden Parameter sind truncatememoryund removememory.

Nick Whaley
quelle
Das Abschneiden und Entfernen des Speichers scheint lediglich den RAM-Zugriff zu beschränken (beginnend mit einem bestimmten Schwellenwert oder rückwärts vom Ende). Bei dieser Frage ging es eher um die Bereitstellung von Bereichen.
Mirh
0

Sie könnten diese Funktion in Windows 7 ausprobieren , aber ich bin mir nicht sicher, welchen Chip er beeinflussen wird oder ob er von jedem den gleichen Betrag abschöpft. Ich muss mich umsehen, um das herauszufinden.

cutrightjm
quelle