# Mémoire à code correcteur d'erreurs

Une mémoire à code correcteur d'erreurs (en anglais, Error-Correcting Code Memory ou ECC Memory) est un type de mémoire vive avec un code correcteur permettant de détecter et de corriger les types les plus courants de corruption de données. Ce type de mémoire est utilisé dans les ordinateurs où la corruption de données ne peut être tolérée en aucun cas, comme pour les calculs scientifiques ou financiers.
En règle générale, la mémoire à code correcteur d'erreurs corrige les erreurs qui affectent un seul bit et détecte celles qui affectent deux bits. Les données qui sont lues à partir d'un mot sont les mêmes que celles qui y ont été écrites même si, entre-temps, un bit a changé d'état.
Grâce à la parité, certaines mémoires non ECC peuvent simplement détecter les erreurs.

## Contexte

Une interférence électrique ou magnétique à l'intérieur d'un ordinateur peut changer la valeur d'un bit de mémoire vive DRAM. On a d'abord pensé que ce phénomène était principalement dû à des particules alpha émises par des contaminants dans les matériaux utilisés dans la fabrication des modules DRAM, mais la recherche a montré que la majorité des erreurs dans les mémoires DRAM se produisent à la suite de rayonnement de fond, principalement des neutrons émis par des réactions engendrées par des rayons cosmiques. Ces neutrons peuvent changer le contenu d'une ou de plusieurs cellules de mémoire ou interférer avec le circuit utilisé pour les lire ou les écrire.
Par conséquent, les taux d'erreur augmentent rapidement avec l'augmentation d'altitude. Par exemple, par rapport au niveau de la mer, le taux de flux de neutrons est 3,5 fois supérieur à 1,5 km d'altitude et 300 fois plus élevé à 10–12 km (l'altitude de croisière des avions commerciaux). En conséquence, les systèmes fonctionnant à haute altitude nécessitent des dispositions spéciales de correction d'erreurs pour en augmenter la fiabilité.
À titre d'exemple, la sonde Cassini-Huygens, lancée en 1997, contient deux enregistreurs de vol identiques, chacun avec 2,5 gigabits de mémoire sous la forme de puces DRAM commerciales. Grâce à des fonctions intégrées de détection et de correction d'erreurs, la télémétrie de la sonde indique le nombre d'erreurs (corrigées) d'un seul bit par mot et le nombre d'erreurs (incorrigibles) de deux bits par mot. Au cours des 2,5 premières années de vol, le vaisseau spatial a signalé un taux d'erreur d'un bit par mot, à peu près constant, d'environ 280 erreurs par jour. Cependant, le 6 novembre 1997, le nombre d'erreurs a augmenté d'un facteur de plus de 4 pour cette journée. Cette augmentation a été attribuée à un vent solaire inhabituel qui a été détecté par le satellite GOES 9.
À une époque, on a craint que la diminution de la taille des composants des modules DRAM et la diminution de la tension utilisée par ces mémoires augmentent le nombre d'erreurs dues au rayonnement cosmique parce que des particules moins énergétiques pourraient modifier l'état d'un bit. D'autre part, on espérait que des cellules plus petites seraient des cibles plus difficiles à atteindre et que des technologies comme le silicium sur isolant rendraient les cellules de mémoire moins sensibles au rayonnement cosmique et contrecarraient, voire inverseraient, la sensibilité accrue due à la réduction de la taille des cellules et du voltage du courant. Finalement, des études ont montré que les erreurs dues au rayonnement cosmique ont baissé de façon spectaculaire avec l'évolution des mémoires et les préoccupations antérieures se sont avérées non fondées.
Des travaux publiés entre 2007 et 2009 ont montré des fréquences d'erreur très variables, avec des variations de plus de 7 ordres de grandeur, allant de 10$^{−10}$ à 10$^{−17}$ erreurs par bit, par heure, c'est-à-dire environ une erreur par bit, par heure, par gigaoctet de mémoire à une erreur par bit, par millénaire, par gigaoctet de mémoire$^,$$^,$. Une étude à très grande échelle basée sur les très nombreux serveurs de Google a été présentée lors de la conférence Sigmetrics / Performance 2009. Le taux d'erreur mesuré était de plusieurs ordres de grandeur plus élevé que les études à petite échelle ou les études de laboratoire précédentes, avec 25 000 à 70 000 erreurs par milliard d'heures, par mégabit (environ 2,5 × 10$^{−11}$ à 7 × 10$^{−11}$ erreur par bit et par heure, soit environ 5 erreurs dans 8 gigaoctets de mémoire par heure en utilisant le taux d'erreur le plus élevé) ; plus de 8 % des modules de mémoire DIMM étaient affectés par des erreurs chaque année.
Les conséquences d'une erreur de mémoire peuvent être très variées. Dans les systèmes sans code correcteur d'erreurs, une erreur peut conduire à une panne de l'ordinateur ou à la corruption des données ; dans les centres de données importants, les erreurs de mémoire sont une des causes de panne de matériel les plus fréquentes. Une erreur de mémoire peut n'avoir aucune conséquence si elle affecte une partie de la mémoire qui n'est pas utilisée, si elle affecte une partie d'un programme sans en changer le fonctionnement ou si elle affecte des données du programme sans en influencer les résultats. Une étude de simulation de 2010 a montré que, pour un navigateur web, seule une petite fraction des erreurs de mémoire provoque une altération des données.
Des tests ont démontré que l'intégrité des cellules de mémoire DRAM peut être affectée par des effets secondaires inattendus d'accès spécialement conçus à des cellules adjacentes. Ainsi, l'accès aux données stockées dans la mémoire DRAM provoque des fuites de charge et des interactions électriques en raison de la forte densité des cellules dans les mémoires modernes. Cela peut modifier le contenu des cellules de mémoire voisines de celles qui étaient visées par les accès mémoire. Cet effet est connu sous le nom de martèlement de mémoire (en anglais Row hammer). Cet effet inattendu des accès mémoire a été utilisé dans certaines attaques informatiques$^,$.

## Solutions

Plusieurs approches ont été développées pour faire face aux erreurs de mémoire : l'immunity-aware programming (uk), les bits de parité, et de la mémoire à code correcteur d'erreurs.
Les erreurs de mémoire peuvent être atténuées en utilisant des modules de mémoire DRAM qui incluent des bits de mémoire supplémentaires et des contrôleurs mémoire qui exploitent ces bits. Les bits supplémentaires sont utilisés pour enregistrer la parité ou permettre l'utilisation d'un code correcteur d'erreurs (ECC). Un bit de parité permet la détection de toutes les erreurs sur un seul bit (en fait, sur un nombre impair de bits). Le code correcteur d'erreurs le plus commun, le code SECDED (en), permet la correction des erreurs sur un seul bit et la détection des erreurs sur deux bits. La technologie Chipkill permet de corriger plusieurs bits en erreur et peut même corriger la perte d'une puce entière de mémoire$^,$.

## Avantages et inconvénients

En fin de compte, il y a un compromis entre la protection contre la perte de données et le coût plus élevé de la mémoire.
La mémoire à code correcteur d'erreurs protège contre la corruption non détectée de données de mémoire. Elle est utilisée dans les ordinateurs où cette corruption est inacceptable, par exemple dans certaines applications de calcul scientifique, en finance ou dans les serveurs. La mémoire à code correcteur d'erreurs permet également de réduire le nombre de plantages d'ordinateur, particulièrement inacceptables dans les applications de serveur multi-utilisateurs et de systèmes à disponibilité maximale. La plupart des cartes mères et des processeurs utilisés pour des applications moins critiques ne sont pas conçus pour soutenir la correction d'erreurs dans le but de maintenir leurs prix au plus bas niveau possible.
La mémoire à code correcteur d'erreurs est plus coûteuse que la mémoire conventionnelle en raison du matériel supplémentaire nécessaire pour la produire et de plus faibles volumes de production de cette mémoire et des composantes associées. Les cartes mères, les chipsets et les processeurs prenant en charge la mémoire à code correcteur d'erreurs sont aussi plus coûteux pour les mêmes raisons.
Une mémoire à code correcteur d'erreurs peut être de 2 à 3 pour cent plus lente qu'une mémoire conventionnelle en raison du temps additionnel nécessaire pour la vérification et la correction des erreurs. Toutefois, les systèmes modernes intègrent la gestion des erreurs dans le processeur, éliminant ainsi les délais de vérification et de correction des accès mémoire$^,$.