La mémoire à code de correction d'erreur ( mémoire ECC ) est un type de stockage de données informatiques qui utilise un code de correction d'erreur (ECC) pour détecter et corriger la corruption de données sur n bits qui se produit dans la mémoire.
En règle générale, la mémoire ECC maintient un système de mémoire immunisé contre les erreurs sur un seul bit : les données lues à partir de chaque mot sont toujours les mêmes que les données qui y ont été écrites, même si l'un des bits réellement stockés a été basculé dans le mauvais état. La plupart des mémoires non ECC ne peuvent pas détecter les erreurs, bien que certaines mémoires non ECC avec prise en charge de la parité permettent la détection mais pas la correction.
La mémoire ECC est utilisée dans la plupart des ordinateurs où la corruption des données ne peut être tolérée, comme les applications de contrôle industriel, les bases de données critiques et les caches de mémoire d'infrastructure.
Concept
Les codes de correction d'erreur protègent contre la corruption de données non détectée et sont utilisés dans les ordinateurs où une telle corruption est inacceptable, par exemple dans les applications de calcul scientifique et financier ou dans les serveurs de bases de données et de fichiers . Les codes de correction d'erreur peuvent également réduire le nombre de pannes dans les applications serveur multi-utilisateurs et les systèmes à disponibilité maximale.
Des interférences électriques ou magnétiques à l'intérieur d'un système informatique peuvent provoquer le basculement spontané d'un seul bit de mémoire vive dynamique (DRAM) vers l'état opposé. On pensait au départ que cela était principalement dû aux particules alpha émises par les contaminants présents dans les matériaux d'emballage des puces, mais des recherches ont montré que la majorité des erreurs logicielles ponctuelles dans les puces DRAM se produisent en raison du rayonnement de fond , principalement des neutrons provenant des rayons cosmiques secondaires, qui peuvent modifier le contenu d'une ou plusieurs cellules de mémoire ou interférer avec les circuits utilisés pour les lire ou les écrire. Par conséquent, les taux d'erreur augmentent rapidement avec l'altitude ; par exemple, par rapport au niveau de la mer, le taux de flux de neutrons est 3,5 fois plus élevé à 1,5 km et 300 fois plus élevé à 10-12 km (l'altitude de croisière des avions commerciaux). Par conséquent, les systèmes fonctionnant à haute altitude nécessitent des dispositions spéciales pour la fiabilité.
À titre d’exemple, le vaisseau spatial Cassini-Huygens , lancé en 1997, contenait deux enregistreurs de vol identiques, chacun doté de 2,5 gigabits de mémoire sous la forme de matrices de puces DRAM commerciales. Grâce à la fonctionnalité EDAC intégrée , la télémétrie technique du vaisseau spatial indiquait le nombre d’erreurs (corrigibles) sur un seul bit par mot et d’erreurs (non corrigibles) sur deux bits par mot. Au cours des 2,5 premières années de vol, le vaisseau spatial a signalé un taux d’erreur sur un seul bit presque constant d’environ 280 erreurs par jour. Cependant, le 6 novembre 1997, au cours du premier mois dans l’espace, le nombre d’erreurs a augmenté de plus d’un facteur quatre ce seul jour. Cela a été attribué à un événement de particules solaires qui avait été détecté par le satellite GOES 9. [
Certains craignent qu'à mesure que la densité de la DRAM augmente et que les composants des puces deviennent plus petits, tandis que les tensions de fonctionnement continuent de baisser, les puces DRAM soient affectées plus fréquemment par ce type de rayonnement, car les particules à plus faible énergie seront capables de modifier l'état d'une cellule mémoire. D'un autre côté, les cellules plus petites produisent des cibles plus petites, et le passage à des technologies telles que le SOI peut rendre les cellules individuelles moins sensibles et ainsi contrecarrer, voire inverser, cette tendance. Des études récentes montrent que les perturbations dues à un événement unique dues au rayonnement cosmique ont diminué de façon spectaculaire avec la géométrie du processus, et les inquiétudes antérieures concernant l'augmentation des taux d'erreur des cellules binaires sont sans fondement.
Recherche
Les travaux publiés entre 2007 et 2009 ont montré des taux d’erreur très variables avec plus de 7 ordres de grandeur de différence, allant de10 −10 erreur/(bit·h) , soit environ une erreur de bit par heure par gigaoctet de mémoire, à10 −17 erreur/(bit·h) , soit environ un bit d'erreur par millénaire par gigaoctet de mémoire. Une étude à grande échelle basée sur le très grand nombre de serveurs de Google a été présentée à la conférence SIGMETRICS/Performance '09. Le taux d'erreur réel trouvé était de plusieurs ordres de grandeur supérieur à celui des études précédentes à petite échelle ou en laboratoire, avec entre 25 000 (2,5 × 10 −11 erreur/(bit·h) ) et 70 000 (7,0 × 10 −11 erreurs/(bit·h) , soit 1 erreur de bit par gigaoctet de RAM pendant 1,8 heure) erreurs par milliard d'heures de périphérique par mégabit. Plus de 8 % des modules de mémoire DIMM ont été affectés par des erreurs par an.
Les conséquences d'une erreur de mémoire dépendent du système. Dans les systèmes sans ECC, une erreur peut entraîner soit un crash, soit une corruption des données ; dans les sites de production à grande échelle, les erreurs de mémoire sont l'une des causes matérielles les plus courantes de pannes de machines. Les erreurs de mémoire peuvent entraîner des vulnérabilités de sécurité. Une erreur de mémoire peut n'avoir aucune conséquence si elle modifie un bit qui n'entraîne pas de dysfonctionnement observable ni n'affecte les données utilisées dans les calculs ou enregistrées. Une étude de simulation de 2010 a montré que, pour un navigateur Web, seule une petite fraction des erreurs de mémoire provoquait une corruption des données, bien que, comme de nombreuses erreurs de mémoire sont intermittentes et corrélées, les effets des erreurs de mémoire étaient plus importants que ce à quoi on pourrait s'attendre pour des erreurs logicielles indépendantes.
Certains tests concluent que l'isolation des cellules de mémoire DRAM peut être contournée par des effets secondaires involontaires d'accès spécialement conçus à des cellules adjacentes. Ainsi, l'accès aux données stockées dans la DRAM provoque la fuite de charges des cellules de mémoire et une interaction électrique, en raison de la forte densité de cellules dans la mémoire moderne, modifiant le contenu des lignes de mémoire voisines qui n'étaient en fait pas traitées lors de l'accès mémoire d'origine. Cet effet est connu sous le nom de row hammer , et il a également été utilisé dans certaines exploitations de sécurité informatique d'escalade de privilèges .
Un exemple d'erreur sur un seul bit qui serait ignorée par un système sans vérification d'erreurs, arrêterait une machine avec vérification de parité ou serait corrigée de manière invisible par ECC : un seul bit est bloqué à 1 en raison d'une puce défectueuse, ou passe à 1 en raison d'un rayonnement de fond ou cosmique ; une feuille de calcul stockant des nombres au format ASCII est chargée, et le caractère « 8 » (valeur décimale 56 dans le codage ASCII) est stocké dans l'octet qui contient le bit bloqué à sa position de bit la plus basse ; puis, une modification est apportée à la feuille de calcul et elle est enregistrée. En conséquence, le « 8 » (0011 100 0 binaire) est devenu silencieusement un « 9 » (0011 100 1 ).
Solutions
Plusieurs approches ont été développées pour gérer les retournements de bits indésirables, notamment la programmation prenant en compte l'immunité, la mémoire de parité RAM et la mémoire ECC .
Ce problème peut être atténué en utilisant des modules DRAM qui incluent des bits de mémoire supplémentaires et des contrôleurs de mémoire qui exploitent ces bits. Ces bits supplémentaires sont utilisés pour enregistrer la parité ou pour utiliser un code de correction d'erreur (ECC). La parité permet de détecter toutes les erreurs sur un seul bit (en fait, tout nombre impair de bits erronés). Le code de correction d'erreur le plus courant, un code de Hamming de correction d'erreur simple et de détection d'erreur double (SECDED) , permet de corriger une erreur sur un seul bit et (dans la configuration habituelle, avec un bit de parité supplémentaire) de détecter les erreurs sur deux bits. Chipkill ECC est une version plus efficace qui corrige également les erreurs sur plusieurs bits, y compris la perte d'une puce mémoire entière.
Implémentations

Seymour Cray a déclaré avec justesse que « la parité est pour les agriculteurs » lorsqu'on lui a demandé pourquoi il avait laissé cela de côté dans le CDC 6600. [ Plus tard, il a inclus la parité dans le CDC 7600 , ce qui a amené les experts à remarquer que « apparemment, beaucoup d'agriculteurs achètent des ordinateurs ». Le PC IBM original et tous les PC jusqu'au début des années 1990 utilisaient le contrôle de parité. Les modèles ultérieurs ne l'ont généralement pas fait.
Un contrôleur de mémoire compatible ECC peut généralement détecter et corriger les erreurs d'un seul bit par mot (l'unité de transfert de bus ) et détecter (mais pas corriger) les erreurs de deux bits par mot. Le BIOS de certains ordinateurs, lorsqu'il est associé à des systèmes d'exploitation tels que certaines versions de Linux , BSD et Windows ( Windows 2000 et versions ultérieures ), permet de compter les erreurs de mémoire détectées et corrigées, en partie pour aider à identifier les modules de mémoire défaillants avant que le problème ne devienne catastrophique.
Certaines puces DRAM incluent des circuits de correction d'erreur « internes » sur puce, qui permettent aux systèmes dotés de contrôleurs de mémoire non ECC de bénéficier néanmoins de la plupart des avantages de la mémoire ECC. Dans certains systèmes, un effet similaire peut être obtenu en utilisant des modules de mémoire EOS .
La détection et la correction des erreurs dépendent de l'anticipation des types d'erreurs qui se produisent. Implicitement, on suppose que la défaillance de chaque bit d'un mot de mémoire est indépendante, ce qui entraîne une improbabilité de deux erreurs simultanées. C'était le cas lorsque les puces mémoire étaient larges d'un bit, ce qui était courant dans la première moitié des années 1980 ; les développements ultérieurs ont déplacé de nombreux bits dans la même puce. Cette faiblesse est corrigée par diverses technologies, notamment Chipkill d' IBM , Extended ECC de Sun Microsystems , Chipspare de Hewlett-Packard et Single Device Data Correction (SDDC) d' Intel .
La mémoire DRAM peut offrir une protection accrue contre les erreurs logicielles en s'appuyant sur des codes de correction d'erreurs. Une telle mémoire de correction d'erreurs , connue sous le nom de mémoire protégée ECC ou EDAC , est particulièrement souhaitable pour les applications hautement tolérantes aux pannes, telles que les serveurs, ainsi que pour les applications dans l'espace lointain en raison de l'augmentation des radiations . Certains systèmes « nettoient » également la mémoire, en lisant périodiquement toutes les adresses et en réécrivant les versions corrigées si nécessaire pour supprimer les erreurs logicielles.
L'entrelacement permet de répartir l'effet d'un seul rayon cosmique, ce qui peut potentiellement perturber plusieurs bits physiquement voisins sur plusieurs mots en associant des bits voisins à des mots différents. Tant qu'un événement unique (SEU) ne dépasse pas le seuil d'erreur (par exemple, une erreur unique) dans un mot particulier entre les accès, il peut être corrigé (par exemple, par un code de correction d'erreur à un seul bit) et un système de mémoire effectivement sans erreur peut être maintenu.
Les contrôleurs de mémoire à correction d'erreur utilisent traditionnellement des codes de Hamming , bien que certains utilisent la redondance modulaire triple (TMR). Cette dernière est préférée car son matériel est plus rapide que celui du schéma de correction d'erreur de Hamming. Les systèmes de satellites spatiaux utilisent souvent la TMR, bien que la RAM satellite utilise généralement la correction d'erreur de Hamming.
De nombreuses premières implémentations de mémoire ECC masquent les erreurs corrigeables, agissant « comme si » l’erreur ne s’était jamais produite, et ne signalent que les erreurs non corrigeables. Les implémentations modernes enregistrent à la fois les erreurs corrigeables (CE) et les erreurs non corrigeables (UE). Certaines personnes remplacent de manière proactive les modules de mémoire qui présentent des taux d’erreur élevés, afin de réduire la probabilité d’événements d’erreur non corrigeables.
De nombreux systèmes de mémoire ECC utilisent un circuit EDAC « externe » entre le processeur et la mémoire. Quelques systèmes avec mémoire ECC utilisent à la fois des systèmes EDAC internes et externes ; le système EDAC externe doit être conçu pour corriger certaines erreurs que le système EDAC interne est incapable de corriger. Les processeurs de bureau et de serveur modernes intègrent le circuit EDAC dans le processeur, avant même le passage aux contrôleurs de mémoire intégrés au processeur, qui sont liés à l' architecture NUMA . L'intégration du processeur permet un système EDAC sans pénalité pendant un fonctionnement sans erreur.
En 2009, les codes de correction d'erreur les plus courants utilisent des codes de Hamming ou de Hsiao qui fournissent une correction d'erreur sur un seul bit et une détection d'erreur sur deux bits (SEC-DED). D'autres codes de correction d'erreur ont été proposés pour protéger la mémoire : codes de correction d'erreur sur deux bits et de détection d'erreur sur trois bits (DEC-TED), codes de correction d'erreur sur un seul quartet et de détection d'erreur sur deux quartets (SNC-DND), codes de correction d'erreur Reed-Solomon , etc. Cependant, dans la pratique, la correction multibit est généralement mise en œuvre en entrelaçant plusieurs codes SEC-DED.
Les premières recherches ont tenté de minimiser la surface et les délais des circuits ECC. Hamming a été le premier à démontrer que les codes SEC-DED étaient possibles avec une matrice de contrôle particulière. Hsiao a montré qu'une matrice alternative avec des colonnes de poids impair offre une capacité SEC-DED avec moins de surface matérielle et un délai plus court que les codes SEC-DED traditionnels de Hamming. Des recherches plus récentes tentent également de minimiser la puissance en plus de minimiser la surface et le délai.
Cache
De nombreux processeurs utilisent des codes de correction d'erreur dans le cache intégré , notamment les processeurs Intel Itanium , Xeon , Core et Pentium (depuis la microarchitecture P6 ) , les processeurs AMD Athlon , Opteron , tous les processeurs basés sur Zen et Zen+ ( EPYC , EPYC Embedded, Ryzen et Ryzen Threadripper ) et le DEC Alpha 21264.
En 2006 , EDC/ECC et ECC/ECC étaient les deux techniques de protection contre les erreurs de cache les plus courantes utilisées dans les microprocesseurs commerciaux. La technique EDC/ECC utilise un code de détection d'erreur (EDC) dans le cache de niveau 1. Si une erreur est détectée, les données sont récupérées à partir du cache de niveau 2 protégé par ECC. La technique ECC/ECC utilise un cache de niveau 1 protégé par ECC et un cache de niveau 2 protégé par ECC. Les processeurs qui utilisent la technique EDC/ECC écrivent toujours tous les STORE dans le cache de niveau 2, de sorte que lorsqu'une erreur est détectée lors d'une lecture à partir du cache de données de niveau 1, une copie de ces données peut être récupérée à partir du cache de niveau 2.
Mémoire enregistrée

La mémoire enregistrée ou tamponnée n'est pas la même que la mémoire ECC ; les technologies remplissent des fonctions différentes. Il est courant que la mémoire utilisée dans les serveurs soit à la fois enregistrée, pour permettre l'utilisation de nombreux modules de mémoire sans problèmes électriques, et ECC, pour l'intégrité des données. La mémoire utilisée dans les ordinateurs de bureau n'est généralement ni l'une ni l'autre, pour des raisons d'économie. Cependant, une mémoire ECC non tamponnée (non enregistrée) est disponible, et certaines cartes mères non-serveur prennent en charge la fonctionnalité ECC de ces modules lorsqu'elles sont utilisées avec un processeur prenant en charge l'ECC. La mémoire enregistrée ne fonctionne pas de manière fiable sur les cartes mères sans circuit de mise en mémoire tampon, et vice versa.
Avantages et inconvénients
En fin de compte, il existe un compromis entre la protection contre la perte inhabituelle de données et un coût plus élevé.
La mémoire ECC est généralement plus chère que la mémoire non ECC, en raison du matériel supplémentaire requis pour produire les modules de mémoire ECC et des volumes de production inférieurs de mémoire ECC et du matériel système associé. Les cartes mères, chipsets et processeurs prenant en charge l'ECC peuvent également être plus chers.
La prise en charge ECC varie selon les fabricants de cartes mères. Il est donc possible que la mémoire ECC ne soit tout simplement pas reconnue par une carte mère incompatible. La plupart des cartes mères et des processeurs destinés aux applications moins critiques ne sont pas conçus pour prendre en charge l'ECC. Certaines cartes mères et certains processeurs compatibles ECC sont capables de prendre en charge l'ECC sans tampon (non enregistré), mais fonctionnent également avec la mémoire non ECC. Le micrologiciel du système active la fonctionnalité ECC si la mémoire ECC est installée.
L'ECC peut réduire les performances de la mémoire d'environ 2 à 3 % sur certains systèmes, selon l'application et l'implémentation, en raison du temps supplémentaire nécessaire aux contrôleurs de mémoire ECC pour effectuer la vérification des erreurs. Cependant, les systèmes modernes intègrent les tests ECC dans le processeur, ne générant aucun délai supplémentaire pour les accès à la mémoire tant qu'aucune erreur n'est détectée. Ce n'est pas le cas de l'ECC in-band , qui stocke les tables utilisées pour la protection dans une région réservée de la mémoire système principale, pris en charge par Intel pour les Chromebooks , qui a montré peu d'impact sur la navigation Web et les tâches de productivité, mais a provoqué jusqu'à 25 % de réduction dans les tests de jeu et de montage vidéo .
La prise en charge de la mémoire ECC peut contribuer à une consommation d'énergie supplémentaire en raison des circuits de correction d'erreurs.