Est-il possible d'exécuter Windows (7, x64) avec un module RAM défectueux? Plus précisément, y a-t-il un moyen de dire à Windows de ne pas attribuer une mauvaise adresse connue ou un bloc d'adresses?
Pour Linux, il existe 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, votre question comporte trois parties. Je vais aborder un à la fois.
Il est en effet possible d’exécuter Windows 7 avec un module défectueux. En fonction de l'emplacement des secteurs défectueux et de l'emplacement du module dans vos banques DIMM, Windows 7 fonctionnera comme si de rien n'était, tant qu'il n'essaie pas de toucher les parties défectueuses de la mémoire. Donc, idéalement, vous déplaceriez le module défectueux aussi loin que possible de la banque 0. Naturellement, s'il s'agit de votre seul module, vous n'avez pas de chance.
Sur les systèmes d'exploitation x86 (32 et 64 bits), la mémoire est gérée par le noyau. Comme vous l'avez dit, BadMem est capable de bloquer les secteurs de mémoire défectueux sous Linux. Cela fonctionne en demandant au noyau de verrouiller les adresses de mémoire que vous avez spécifiées. Cela empêche efficacement Linux d'adresser jamais ces adresses lors de l'allocation (et de la désallocation) de la mémoire. Mais pour ce faire, BadMem doit corriger le noyau. BadMem n'est rien d'autre qu'un correctif de noyau que vous configurez avant de l'appliquer.
Maintenant, vous n'avez pas cette capacité sous Windows. Vous ne pouvez pas patcher le noyau. Développer un pilote en mode noyau ne vous sera d'aucune utilité, car le noyau Windows ne laissera jamais votre pilote prévaloir 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. Le seul moyen serait que Microsoft corrige le noyau spécifiquement pour votre cas. Peu probable.
Il n'y a pas beaucoup de raisons pour lesquelles un module de mémoire peut contenir des adresses incorrectes. En fin de compte, tout se résume à une erreur dans la chaîne de production, en supposant que celle-ci n’a pas subi de dommages avant de pénétrer dans votre ordinateur. Contrairement aux disques durs, les modules de mémoire ne contiennent aucune pièce mobile, comme vous le savez bien. Ainsi, les secteurs défectueux ne tendent pas à se répandre, contrairement aux secteurs des disques durs.
Cependant, le logiciel de test de mémoire n'est pas infaillible. Il est possible (et courant) qu'il transmette certaines adresses réellement mauvaises. Une mauvaise mémoire peut donner l’impression de se "répandre" à mesure que 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 indiquez.
Il est peu probable que quiconque puisse effectuer un test approfondi d'un module de mémoire et identifier toutes les adresses de mémoire défectueuses, 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 des adresses incorrectes comme un module défectueux et par conséquent de ne pas être fiable.
Cela signifie que, même si BadMem est une proposition attrayante, elle n’est en fait pas une solution au problème de la mauvaise mémoire. Plus probablement qu'autrement, vous vous retrouverez toujours avec un système d'exploitation qui tente 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.
Le BCD Windows (données de configuration de démarrage) a en réalité un objet {badmemory}
. Il semble que les adresses de mémoire qui sont "prévues pour échouer" par la mémoire ECC seront répertoriées ici et ne seront pas utilisées par le système d'exploitation.
L'objet {badmemory}
accepte un élément BadMemoryList
(type BCD 0x1700000a
), qui correspond à une liste d'entiers pouvant être entrés au format hexadécimal, séparés par des espaces. J'imagine qu'il serait possible d'insérer manuellement les mauvaises adresses mémoire détectées par memtest86 dans cet élément - mais je n'ai pas testé cela. Apparemment, il accepte les numéros de bloc de page, qui correspondent à l'adresse réelle divisée par 4096. Malheureusement, ces adresses/PFN peuvent ne pas correspondre à ceux indiqués 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é dans les autres réponses. Ceci est simplement une note sur un moyen possible de contourner le problème (temporairement?).
J'ai eu des problèmes RAM dans une tablette avec SoC. La mémoire est soudée ou intégrée au SoC et ne peut pas être remplacée.
Je suis en Argentine et le vendeur est en Chine. En raison des coûts et du délai de livraison, l'envoi d'une garantie n'a aucun sens.
J'ai réussi quelques hits.
La clé pour transmettre les paramètres de mémoire endommagés est la suivante:
0x10000000
correspond à 0x10000 dans Windows0x00001000
correspond à 0x1 dans Windowsbcdedit /set {badmemory} badmemorylist 0xB7 0xB8 0xB9 0xBA
to erreurs dans memtest de 0x000B7000 à 0x000BAFFF. Notez que vous ne pouvez pas mettre une plage de mémoires, mais toutes les pages une par unebcdedit /enum {badmemory}
, montre la liste des pages marquées.bcdedit /set badmemoryaccess no
empêcher les pages marquées sont utiliséesWindows BCD a des objets {badmemorylist}
et {badmemoryaccess}
. Vous devez définir la première sur les pages de mémoire défectueuse 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 ça marche bien
Vous pouvez tester vos paramètres avec Rammap by Sysinternals
PS j'ai cette information de "Windows Internals Book" chapter 10
Euh, je ne me sentirais pas à l'aise d'utiliser la mémoire que je savais être mauvaise, même si vous pouviez verrouiller les parties défectueuses. Je voudrais acheter un nouveau bâton pour la tranquillité d'esprit.
Autant que je sache, le seul moyen de procéder consiste à utiliser la commande BurnMem, qui peut limiter artificiellement la quantité d'utilisation de RAM windows.
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.
ATTENTION !!! Windows ne parvient 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 de manière aléatoire ou si vous mettez 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 de mémoire continue dans un fichier .txt prêt pour bcdedit /set badmemorylist
ou bcdedit /set {badmemory} badmemorylist
(ne fonctionne pas sous Win7 pour moi)
Utilisez bcdedit /set badmemoryaccess 0
pour refuser l'accès.
Vous pouvez vérifier avec EasyBCD dans Afficher les paramètres -> Détaillé. Après un redémarrage avec Rammap, vérifiez 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;
}
Oui. Il existe un paramètre de démarrage pour contrôler la quantité de mémoire que Windows peut utiliser. Cependant, vous ne pouvez supprimer que de la fin de l’espace mémoire. Voir cet article msdn pour contrôler les paramètres d’amorçage. Les paramètres d'intérêt sont truncatememory
et removememory
.
Vous pourriez essayer cette fonctionnalité dans Windows 7, mais je ne suis pas sûr de la puce qu'il affectera, ou s'il parcourt la même quantité de chaque. Je vais devoir regarder autour de moi pour le découvrir.