Exécution de Windows avec une RAM défectueuse

25

Est-il possible d'exécuter Windows (7, x64) avec un module RAM défectueux? Plus précisément, existe-t-il un moyen de dire à Windows de ne pas allouer une mauvaise adresse connue ou un bloc d'adresses?

Pour Linux, il y a BadRAM . Existe-t-il une implémentation existante pour Windows? Est-ce même possible avec le noyau de Windows (NT 6.1)? Peut-être un pilote en mode noyau?

Bob
la source
4
@ekaj Si ce n'était qu'une semaine après l'achat, peut-être le remplacer sous garantie? ;)
Bob
3
En fait, c'est l'idée la plus intelligente, c'est cassé, faites-les réparer
Journeyman Geek

Réponses:

15

Bob, votre question comporte trois parties. Je vais en parler un à la fois.

Exécuter Windows avec une mauvaise mémoire

Il est en effet possible d'exécuter Windows 7 avec un module défectueux. Selon l'emplacement des secteurs défectueux et l'emplacement du module dans vos banques DIMM, Windows 7 fonctionnera comme s'il n'y avait rien tant qu'il n'essayait pas de toucher les mauvaises parties de la mémoire. Donc, idéalement, vous déplaceriez le module défectueux aussi loin que possible de la banque 0. Naturellement, si c'est votre seul module, vous n'avez pas de chance.

Blocage des secteurs de mauvaise mémoire dans Windows

Sur les systèmes d'exploitation x86 (32 et 64 bits), la mémoire est gérée par le noyau. Comme vous le mentionnez, BadMem est capable de bloquer les secteurs de mauvaise mémoire sous Linux. Il fonctionne en demandant au noyau de verrouiller les adresses mémoire que vous avez spécifiées. Cela empêche effectivement Linux d'adresser ces adresses lors de l'allocation (et de la désallocation) de la mémoire. Mais pour ce faire, BadMem doit patcher le noyau. BadMem n'est rien de plus qu'un correctif de noyau que vous configurez avant d'appliquer.

Maintenant, vous n'avez pas cette capacité sur Windows. Vous ne pouvez pas patcher le noyau. Développer un pilote en mode noyau ne vous sera d'aucune utilité non plus, car le noyau Windows ne laissera jamais votre pilote prendre le pas sur son architecture de gestion de la mémoire (ce qui est compréhensible).

Pour cette raison, vous ne pouvez en aucun cas demander à Windows de ne pas utiliser certaines adresses mémoire. La seule façon serait que Microsoft corrige le noyau spécifiquement pour votre cas. Peu probable.

La propagation d'adresses de mauvaise mémoire

Il n'y a pas beaucoup de raisons pour lesquelles un module de mémoire peut contenir de mauvaises adresses. En fin de compte, tout se résume à une erreur dans la chaîne de production, en supposant qu'il n'a pas subi de dommages avant d'entrer dans votre ordinateur. Contrairement aux disques durs, il n'y a pas de pièces mobiles dans les modules de mémoire, comme vous le savez bien. Ainsi, les secteurs défectueux n'ont pas tendance à se propager comme c'est le cas avec les secteurs de disque dur.

Cependant, le logiciel de test de mémoire n'est pas infaillible. Il est possible (et courant) de lui transmettre certaines adresses qui sont en fait mauvaises. Une mauvaise mémoire peut donc donner l'impression de "se propager" car de plus en plus d'adresses se révèlent mauvaises. Pour cette raison, des outils comme BadMem révèlent leur faiblesse, car ils ne peuvent naturellement gérer que les adresses que vous leur demandez.

Il est peu probable que quiconque puisse effectuer un test approfondi d'un module de mémoire et identifier toutes les mauvaises adresses de mémoire, puis les verrouiller et se retrouver avec un «bon» module de mémoire. La chose la plus simple à faire est de considérer un module avec de mauvaises adresses comme un module défectueux et donc de ne pas faire confiance.

Cela signifie que, même si BadMem est une proposition attrayante, ce n'est en fait pas une solution au problème de la mauvaise mémoire. Plus probablement alors non, vous vous retrouverez toujours avec un système d'exploitation qui essaie de lire un secteur défectueux et se bloque avec une erreur d'arrêt. Un mauvais module est un mauvais module est un mauvais module.

Un nain
la source
Il y a assez peu de bonnes réponses, mais je vais accepter cela pour donner une bonne raison pourquoi ne pas le faire. On peut dire au noyau Windows de ne pas utiliser au-delà d'une certaine adresse, comme d'autres l'ont noté, mais lorsque l'erreur se trouve au milieu de l'espace d'adressage, c'est comme utiliser une hache lorsque vous voulez un scapel ... un contrôle plus fin est souhaité mais, apparemment, impossible. C'est dommage.
Bob
8
Pas tout à fait correct; il est possible de demander à Windows d'éviter certaines adresses (plus précisément, certains numéros de cadre de page). La fonctionnalité est conçue pour la mémoire ECC, avec laquelle Windows peut détecter d'éventuels défauts et marquer ces PFN comme mauvais, mais il est possible d'ajouter manuellement des PFN à la liste: superuser.com/a/490522/117590 - tout simplement pas très pratique. Donc, oui, le remplacement reste la meilleure option: P
Bob
17

Le Windows BCD (Boot Configuration Data) a en fait un {badmemory}objet. Il semble que les adresses mémoire qui sont "prédites en panne" par la mémoire ECC soient répertoriées ici et ne soient pas utilisées par le système d'exploitation.

L' {badmemory}objet accepte un élément BadMemoryList(type BCD 0x1700000a), qui est une liste d'entiers pouvant être entrés en hexadécimal, séparés par des espaces. Je suppose qu'il serait possible d'insérer manuellement des adresses de mémoire incorrectes trouvées par memtest86 dans cet élément - mais je n'ai pas testé cela. Apparemment, il accepte les numéros de cadre de page, qui est l'adresse réelle divisée par 4096. Malheureusement, ces adresses / PFN peuvent ne pas correspondre à celles signalées par les diagnostics de mémoire. L'édition manuelle peut être effectuée avec Visual BCD Editor .

Dans tous les cas, les clés USB défectueuses doivent être remplacées comme indiqué par les autres réponses. Il s'agit simplement d'une note sur une manière possible de contourner le problème (temporairement?).

Bob
la source
Un tutoriel mieux formaté de tout ce que vous avez dit est disponible ici . Beau travail malgré tout.
mirh
13

Windows BCD a {badmemorylist}et des {badmemoryaccess}objets. Vous devez définir la première sur les pages de mauvaise mémoire séparées par des espaces (par exemple. bcdedit /set badmemorylist 1499543 1434007) Et la seconde sur No( bcdedit /set badmemoryaccess No)

Gardez à l'esprit que la taille de la page mémoire dans Windows est généralement 4KB

Testé sous Windows 7 et cela fonctionne bien

Vous pouvez tester vos paramètres par Rammap by Sysinternals

PS j'ai cette information de "Windows Internals Book" chapter 10

Vyacheslav Dorzhiev
la source
13

J'ai eu des problèmes de RAM dans une tablette avec SoC. La mémoire est soudée ou intégrée dans le SoC et ne peut pas être remplacée.

Je suis en Argentine et le vendeur est en Chine, et les frais d'expédition et le temps, cela n'a aucun sens d'envoyer une garantie.

J'ai réussi quelques coups sûrs.

La clé pour passer les paramètres de mémoire endommagés sont:

  1. les adresses dans memtest86 correspondent aux adresses utilisées dans Windows.
  2. doit marquer des pages entières de 4 Ko.
  3. dans memtest 0x10000000correspond à 0x10000 sous Windows
  4. dans memtest 0x00001000correspond à 0x1 sous Windows
  5. signifie: Le numéro de page dans les fenêtres supprime les 3 derniers nombres hexadécimaux memtest.
  6. signifie que: Windows élimine les zéros dans la gauche.
  7. considérez 5 et 6, pour éviter les erreurs dans les numéros de page.
  8. l'instruction correcte est: bcdedit /set {badmemory} badmemorylist 0xB7 0xB8 0xB9 0xBAaux erreurs dans memtest de 0x000B7000 à 0x000BAFFF. Notez que vous ne pouvez pas mettre une gamme de souvenirs, mais toutes les pages une par une
  9. ne peut pas ajouter de pages, toutes les pages doivent être marquées dans la même commande. Si une nouvelle page, ajoute remplace les anciennes. J'ai réussi à ajouter 4096 pages dans une seule commande. Je ne l'ai plus essayé.
  10. bcdedit /enum {badmemory}, affiche la liste des pages marquées.
  11. bcdedit /set badmemoryaccess no empêcher l'utilisation des pages marquées
  12. il est nécessaire de redémarrer après avoir marqué les pages et de supprimer l'accès.
jgustavo
la source
1
J'ai dû supprimer l'espace blanc entre le /et la commande pour que cela fonctionne, donc au lieu de bcdedit / enum {badmemory}cela, ce sera le bcdedit /enum {badmemory}même pour les autres
flagg19
Cela fonctionne, mais malheureusement, la limite de cmd sur Windows est limitée à 8191 et je n'ai pas pu bloquer toutes les pages de mauvaise mémoire. Je n'ai pas pu trouver une bonne solution de contournement pour résoudre ce problème. Existe-t-il un moyen d'enregistrer une plage de pages? Je devrais bloquer toutes les pages de 0x714bc8 à 0x71cbd0 ce qui est trop de pages! Qu'est-ce que j'ai fait, alors? J'ai exécuté le test le plus simple (# 0 et # 1) et il a obtenu une plage d'erreur de mémoire plus limitée. Il fonctionne bien jusqu'à présent, plus d'écrans bleus. Mais je sais que je n'ai pas bloqué tout ce qui serait nécessaire.
Felipe
3

Pour autant que je sache, la seule façon de le faire est d'utiliser la commande BurnMem qui peut artificiellement limiter la quantité de RAM utilisée par Windows.

Oliver G
la source
2
Hmm .. c'est une option intéressante. Peut maxmem- être , car apparemment burnmemne limite pas l'adresse physique max maxmem. Le Vista et son équivalent 7 le seraient truncatememory. Bien qu'il s'agisse d'une solution possible, existe-t-il une méthode plus précise pour les cas où la mémoire défectueuse se trouve au milieu ou au début de l'espace d'adressage et qui bloque tout ce qui n'est pas souhaité?
Bob
@Bob - La raison pour laquelle vous ne pouvez pas simplement remplacer le module de mauvaise mémoire est pourquoi?
Ramhound
@Ramhound je pourrais, si je le voulais. Mais cela prendrait du temps. En ce moment, je cours avec la moitié de ma mémoire d'origine, pas génial pour mes machines virtuelles. Obtenir un module nouveau ou de remplacement qui fonctionnerait réellement pourrait prendre quelques semaines. Si une solution logicielle me permet de le faire en deux heures ou moins, je considérerais que c'est du temps bien dépensé et quelque chose de nouveau appris. J'accepterais cette réponse (ma mémoire a échoué juste à la fin de l'espace d'adressage) mais si quelqu'un a une solution plus polyvalente, je préférerais cela pour une référence future.
Bob
@Bob - Après avoir lu cela assez longuement, il semble que ce ne soit pas possible. En effet, BadRam utilise memtest pour demander au noyau d'exclure les mauvaises adresses du chargeur de démarrage, Windows n'est pas en mesure de le faire car il n'y a actuellement aucun moyen pour lui de déterminer quelles mauvaises adresses à exclure de la même manière qu'un noyau corrigé BadRam peut .
Oliver G
3

Regardez cet util: https://github.com/prsyahmi/BadMemory

Il est très facile à utiliser et prend en charge le blocage des plages d'adresses. Et vous pouvez utiliser l'adresse complète reçue de MemTest86 sans supprimer les trois derniers chiffres.

osipxd
la source
2

MISE EN GARDE!!! Windows peut ne pas démarrer, soyez prêt à reconstruire le BCD. Dans ce cas, utilisez l'invite de commande dans les options de démarrage avancées. Je ne sais pas pourquoi il ne démarre plus, semble se produire au hasard ou si vous avez mis trop d'adresses dans badmemorylist.

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

Voici un programme d'invite de commande C ++ qui obtient une liste d'adresses mémoire continue dans un fichier .txt prêt pour bcdedit /set badmemorylistou bcdedit /set {badmemory} badmemorylist(n'a pas fonctionné sur Win7 pour moi)

Utilisez bcdedit /set badmemoryaccess 0pour refuser l'accès.

Vous pouvez vérifier avec EasyBCD dans Paramètres d'affichage -> Détaillé. Après un redémarrage, vérifiez auprès de Rammap si l'espace d'adressage physique a disparu.

#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
la source
1

Oui. Il existe des paramètres de démarrage pour contrôler la quantité de mémoire que Windows peut utiliser. Vous ne pouvez cependant supprimer qu'à la fin de l'espace mémoire. Consultez cet article msdn pour contrôler les paramètres de démarrage. Les paramètres d'intérêt sont truncatememoryet removememory.

Nick Whaley
la source
Tronquer et supprimer de la mémoire semble simplement couper l'accès à la RAM (à partir d'un seuil donné ou à rebours de la fin). Cette question concernait davantage la fourniture de plages.
mirh
0

Vous pouvez essayer cette fonctionnalité dans Windows 7, mais je ne sais pas quelle puce cela affectera, ou si elle efface la même quantité de chacun. Je vais devoir regarder autour de moi pour le découvrir.

cutrightjm
la source