Memtest86 + teste-t-il la mémoire utilisée pour s'exécuter?

65

L'un des scénarios de défaillance de serveur les plus courants est une DRAM défectueuse, parfois même lorsque la mémoire ECC est utilisée.

memtest86+est l’un des outils les plus utiles pour diagnostiquer les problèmes de DRAM. Comme il se charge au début de la mémoire, je me demandais si memtest86+vérifie la partie de la mémoire qui memtest86+est chargée.

La mémoire allouée est-elle memtest86+si petite qu'elle importe peu ou est-il possible que memtest86+la mémoire DRAM manque un défaut car elle ne peut pas tester les emplacements de mémoire dans lesquels elle réside?

Robin
la source
8
Bien que cette question soit pertinente pour un serveur, elle l'est également pour un PC ordinaire. J'ai donc voté en faveur du transfert de cette question à un super utilisateur , de sorte qu'elle puisse atteindre davantage de personnes.
Cristian Ciupitu

Réponses:

78

De toute évidence, memtest86 + ne peut pas tester la région de la mémoire qui contient actuellement le code exécutable de memtest86 + (mais s'il y a des erreurs de mémoire dans cette région, il est très probable que le test lui-même échoue). Cependant, memtest86 + est capable de déplacer son propre code vers une adresse différente au moment de l'exécution, et en utilisant cette astuce, il est en mesure de tester toute la mémoire que le microprogramme (BIOS) l'autorise à utiliser, mais pas tout à la fois.

Cette relocalisation de code est décrite dans README.background à l'intérieur de l'archive de code source memtest86 + (le fichier est légèrement obsolète). en fait 0x10000 et l'adresse haute est 0x2000000 ou 0x300000 en fonction de la quantité de mémoire de la machine).

Mais même avec cette astuce de relocalisation, memtest86 + n'est pas en mesure de tester toute la mémoire pour les raisons suivantes:

  • Habituellement, le microprogramme (BIOS) réserve certaines régions de la RAM à son propre usage (par exemple, les tables ACPI). Bien que l’UC puisse accéder à ces régions de RAM, tout ce qui y est écrit peut entraîner un comportement imprévisible.

  • Une partie de la RAM est utilisée pour le mode de gestion système et n'est même pas accessible à partir de la CPU en dehors du code privilégié SMM.

  • La plage d’adresses de la RAM comprise entre 640K et 1M est inaccessible en raison des particularités de l’agencement de la mémoire du PC hérité (une partie de cette RAM peut être utilisée en tant qu’ombre pour la ROM du BIOS et pour le SMM, d’autres parties peuvent être totalement inaccessibles).

Sergey Vlasov
la source
1
Intéressant, j'ai manqué sa capacité de relocalisation. Évidemment, SMM et les goûts sont hors de portée (hormis le support BIOS spécifique).
Shodanshok
Ces régions cartographiées excluent généralement la mémoire DRAM car une autre solution "hors module" est en cours de traitement ROM et les périphériques disent.
mckenzm
3
Si vous avez plusieurs modules RAM, effectuez un deuxième test après les avoir échangés ...
JFL
Est-il possible que la mémoire échoue de la bonne façon pour que memtest rapporte de manière incorrecte le succès dû à la réécriture de ses instructions? Ou plutôt, combien faut-il de fautes?
John Dvorak
3
@ JanDvorak: En théorie, c'est possible, bien sûr. En pratique, je dirais qu'il est légèrement plus probable que de taper du pied sur le clavier et de taper au hasard un sonnet shakespearien.
Ilmari Karonen
5

Non, memtest ne peut pas tester sa propre mémoire. Cependant, il est si petit (quelques Ko seulement) que cela importe peu. EDIT: cette instruction est fausse car, comme indiqué dans la réponse sélectionnée, memtest peut se déplacer de manière dynamique pour tester toute la mémoire adressable par l'utilisateur.

-

En théorie, les processeurs modernes peuvent, au démarrage, configurer une partie de leur cache en tant que mémoire programmable. De très petits programmes (tels que memtest) peuvent être exécutés sans toucher à la mémoire DRAM.

Cependant, il s’agit d’une fonctionnalité spécifique au modèle (qui nécessite une prise en charge du BIOS) et je ne pense pas que memtest l’utilise.

Shodanshok
la source
Merci pour votre réponse. memtestteste également le cache du processeur. Donc, si memtestvous voulez charger dans ce cache, alors cette partie du cache ne pourrait pas être testée, ce qui est plus problématique, car elle est beaucoup plus petite que la mémoire?
Robin
2
Besed sur la documentation Memtest86 ne pas tester le cache du processeur, au moins d'une manière directe. De plus, les processeurs modernes ont des instructions et un cache de données distincts (I $ et D $). Le code exécutable est chargé dans le cache d'instructions et ne peut pas être directement modifié / remplacé
shodanshok
1
memtest86 + teste définitivement le cache de données des processeurs, mais peu importe la question. Merci encore pour votre réponse.
Robin
3
Es-tu sûr de ça? Je pensais qu'il se copiait ailleurs en testant la mémoire dans laquelle il réside normalement. C'est pourquoi chaque test comporte une partie lente (la plus grande partie de la mémoire) et une partie très rapide (la petite partie où son code / ses données sont stockés).
Peter Cordes
1
@DmitryGrigoryev: Ah ok .. alors j'ai appris quelque chose de plus :-) Cool merci!
Robin