Fonctionnement d'un ordinateur/Le bus mémoire
Le bus mémoire est en soi très simple : c'est juste un ensemble de fils, avec quelques circuits annexes qui servent à interfacer ce bus avec la processeur et la mémoire. En somme, des fils et de la glue logic. Néanmoins, il y a quand même des choses à dire dessus, surtout qu'il ne prend pas la même forme sur les ordinateurs PC et sur les autres architectures.

La plupart des PC commerciaux utilisent des barrettes de RAM, qu'on peut retirer de la carte mère si besoin. Le bus mémoire est donc relié à un connecteur standardisé, appelé slot mémoire, dans lequel on insère une barrette de RAM. La barrette de RAM est en soi un morceau de plastique sur lequel on place les puces mémoires, avec des broches dorées qui font contact avec le connecteur, et des interconnexions pour relier les puces aux broches dorées.

Par contre, les autres systèmes n'utilisent pas de barrettes de RAM. Ils sont fournit avec une quantité de RAM bien précise, qu'on ne peut pas upgrader. La RAM est alors soudée sur la carte mère, et le bus mémoire est une connexion directe entre processeur et mémoire RAM. Il n'y a pas de connecteur dédié, juste des puces mémoire. De nombreux ordinateurs portables font ça, mais aussi les smartphones, les microcontrôleurs ou d'autres systèmes du même genre.
Les systèmes anciens avaient des bus mémoires assez réduits, peu larges, en raison de contraintes techniques. Il était intéressant de limiter la taille du bus mémoire pour économiser des broches, que ce soit sur le processeur ou la mémoire RAM. Les systèmes modernes n'ont pas ce problème, l'évolution de la technologie permet au contraire d'avoir des bus mémoire assez large. Il s'agit de deux contraintes différentes : soit on économise des broches au détriment de la performance, soit on sacrifie beaucoup de fils/broches pour avoir des performances excellentes. Les deux cas donnent des contraintes très différentes, voyons comment les deux contraintes façonnent le bus mémoire.
Les bus mémoire réduits : l'économie de broches
[modifier | modifier le wikicode]Faire des économies sur le bus mémoire peut viser plusieurs objectifs. Il est possible de réduire le nombre de fils du bus mémoire, de réduire le nombre de broches du processeur ou d'économiser les broches de la mémoire RAM/ROM. Les trois objectifs sont assez différents, et certains sont plus utiles que d'autres. Par exemple, un processeur a besoin de beaucoup plus de broches qu'une mémoire pour faire son travail, vu que l'interface d'un processeur est assez complexe. Les processeurs doivent donc utiliser pas mal de ruses pour économiser des broches, comme un usage de bus multiplexés, de bus d'adresse multiplexé, etc. À l'inverse, les mémoires RAM/ROM peuvent parfaitement s'en passer, vu que leur interface est assez simple. Les contraintes entre processeur et mémoires RAM/ROM sont donc opposées.
Une méthode intéressante pour économiser des broches sur le processeur est d'utiliser un bus multiplexé. En théorie, cela demande d'avoir une mémoire compatible, qui tendent à être rares et plus chères. Les mémoires de faible capacité sont souvent sans bus multiplexés, alors que les processeurs à bas cout avec bus multiplexés sont plus fréquents. Heureusement, il est possible d'implémenter un bus multiplexé avec une mémoire qui ne l'est pas, ce qui permet d'avoir le meilleur des deux mondes : cela permet d'utiliser un processeur et une mémoire à bas prix, tout en ayant des processeurs avec peu de broches. Mais cela demande de faire quelques modifications sur le bus mémoire pour que cela fonctionne.
Un exemple est donné dans le schéma ci-dessous. Le processeur possède un bus multiplexé, alors que la mémoire EPROM a un bus d'adresse séparé du bus de données. Dans cet exemple, le processeur ne peut faire que des lectures, vu que la mémoire est une mémoire EEPROM, mais la solution marche aussi dans le cas où la mémoire est une RAM. L'implémentation demande juste l'ajout d'un registre sur le bus d'adresse et une commande adéquate de l'entrée OE (Output Enable). Pour faire une lecture, le processeur procède en deux étapes, comme sur un bus multiplexé normale : l'envoi de l'adresse, puis la lecture de la donnée.
- Lors de l'envoi de l'adresse, l'adresse est mémorisée dans le registre, la broche ALE étant reliée à l'entrée Enable du registre. De plus, on doit déconnecter la mémoire du bus de donnée pour éviter un conflit entre l'envoi de la donnée par la mémoire et l'envoi de l'adresse par le processeur. Pour cela, on utilise l'entrée OE (Output Enable).
- La lecture de la donnée consiste à mettre ALE à 0, et à récupérer la donnée sur le bus. Pendant cette étape, le registre maintient l'adresse sur le bus d'adresse. Le bit OE est configuré de manière à activer la sortie de données.

Le dual-channel, triple-channel ou quad-channel
[modifier | modifier le wikicode]Les techniques de dual-channel permettent de combiner ensemble 2 barrettes de mémoire RAM de manière à soit gagner en performances, soit en stabilité mémoire. Il existe aussi des techniques de triple-channel ou quad-channel, qui font la même chose mais avec respectivement 3 et 4 barrettes de RAM. Le cas le plus courant est celui où les deux barrettes sont combinées de manière à doubler le débit binaire de la mémoire RAM. Cependant, il existe aussi des techniques de memory mirroring, qui visent à améliorer la résistance face aux pannes. Voyons ces deux techniques dans le détail.
Pour en profiter, il faut placer les barrettes mémoire d'une certaine manière sur la carte mère. Typiquement, une carte mère dual channel a deux slots mémoires, voire quatre. Quand il y en a deux, tout va bien, il suffit de placer une barrette dans chaque slot. Mais dans le cas où la carte mère en a quatre, les slots sont d'une couleur différent pour indiquer comment les placer. Il faut placer les barrettes dans les slots de la même couleur pour profiter du dual channel.
Le dual-channel classique : de meilleures performances
[modifier | modifier le wikicode]Le dual-channel classique double le débit binaire de la mémoire RAM, car le débit binaire des deux barrettes de RAM s'additionne. Du moins, dans un cas idéal, il y a des conditions pour arriver à ce maximum théorique. Ca ne marche que si le processeur accède à des adresses consécutives, ce qui est fréquemment le cas.
Intuitivement, vous vous dites que chaque barrette a sa propre connexion au contrôleur mémoire, elle a un bus mémoire dédiée rien qu'à elle. Mais dans les faits, ce n'est pas le cas. À la place, le bus de données est élargit. Sans dual channel, il y a un unique bus mémoire de 64 bits, qui est relié aux deux barrettes, chacune ayant une interface de 64 bits. Avec le dual-channel, le bus mémoire passe à 128 bits. Reste à voir comment est exploité ce bus de données doublé.
Le dual channel se contente d'agrandir chaque mot mémoire, en doublant sa taille. L'idée est de lire/écrire des mots mémoire de 128 bits, dont les 64 bits de poids faible sont lus/écrits dans la première barrette, les 64 bits de poids fort depuis la seconde barrette. Pour cela, l'adresse mémoire est envoyée aux deux barrettes en même temps. Les deux barrettes de RAM répondent à la même adresse mémoire, la même adresse de mot. Elles lisent/écrivent chacune 64 bits de leur côté. Le triple-channel fait de même avec des mots mémoire de 192 bits répartis sur trois barrettes de RAM, le quad-channel utilise des mots mémoire de 256 bits répartis sur quatre barrettes de mémoire.

Il y a cependant une petite subtilité, liée à l'alignement mémoire. Voyons ce qui se passe du point de vue du processeur. Pour rappel, le processeur utilise des adresses d'octets, à savoir que chaque octet de la RAM a sa propre adresse. Par contre, les SDRAM modernes sont découpées en mots mémoire de 64 bits, chacun ayant sa propre adresse mémoire. Il y a donc une différence entre les adresses manipulées par le processeur et celles que comprend la mémoire RAM. L'adresse d'octet est découpée en deux portions : l'adresse mémoire envoyée à la SDRAM, et la position de l'octet dans le mot 64 bits adressé par l'adresse mémoire.
| Adresse mémoire | Position de l'octet dans un bloc de 64 bits |
|---|---|
| Adresse mémoire | 5 bits |
Sans dual channel, la première barrette correspond à la moitié haute de la RAM, la seconde barrette correspond à la moitié basse. Pour cela, le contrôleur mémoire doit connaitre la taille de la RAM installée. De son point de vue, certains bits de l'adresse seront inutilisés, car il n'y aura pas assez de RAM installée pour avoir à les utiliser.
| Adresse mémoire | Position de l'octet dans un bloc de 64 bits | |
|---|---|---|
| Bits inutilisés car pas assez de RAM installée | Reste de l'adresse mémoire | 5 bits |
Vu que les deux barrettes ont la même capacité, un bit de l'adresse dit dans quelle barrette cette adresse est attribuée. Et pour du triple-quad channel, c'est deux bits qui sont utilisés.Les bits en question sont les bits de poids fort de l'adresse mémoire. L'adresse est donc découpée comme suit :
| Adresse mémoire | Position de l'octet dans un bloc de 64 bits | ||
|---|---|---|---|
| Bits inutilisés car pas assez de RAM installée | Numéro de barrette - 1 ou 2 bits | Adresse mémoire | 5 bits |
Avec le dual channel, la répartition des adresses mémoire est différente. Intuitivement, on se dit que deux adresses mémoires consécutives seront placées dans deux barrettes différentes. Pour cela, le numéro de barrette est déplacé. Il est placé dans les bits de poids faible de l'adresse mémoire, pas dans les bits de poids fort.
| Adresse mémoire | Position de l'octet dans un bloc de 64 bits | ||
|---|---|---|---|
| Bits inutilisés car pas assez de RAM installée | Adresse mémoire | Numéro de barrette - 1 ou 2 bits | 5 bits |
Pour adresser la mémoire, seule l'adresse mémoire est utilisée. C'est elle qui est envoyée à toutes les barrettes de RAM. L'adresse mémoire est donc amputée d'un ou deux bits, puis est envoyée aux barrettes de RAM.

Le memory mirroring
[modifier | modifier le wikicode]Le memory mirroring est utilisé sur des serveurs, ou des systèmes devant fonctionner en permanence avec un haut niveau de fiabilité. Sur de tels ordinateurs, il est très important d'éviter tout problème matériel, toute panne, mais aussi : tout corruption de données. Et c'est là que la technique du memory mirroring entre en scène. Le memory mirroring duplique les données à l'identique sur deux barrettes de mémoire. Les deux barrettes mémoires contiennent donc les mêmes données, aux mêmes endroits. Le fait de dupliquer les données a plusieurs avantages.
Premièrement, si une barrette de RAM tombe en panne, l'autre peut prendre la relève, le temps qu'on remplace la barrette fautive. Il existe des serveurs qui sont conçus pour qu'on puisse rajouter ou retirer de la RAM à chaud, sans avoir à éteindre l'ordinateur. D'autres demandent que l'ordinateur soit arrêté, ce qui demande une intervention pouvant arriver dans un moment, l'ordinateur peut continuer à tourner avec une seule barrette pendant ce temps.
Deuxièmement, cela permet de détecter d'une corruption de données quelconque. Les mémoires RAM ne sont pas fiables à 100%, et il est possible qu'un bit s'inverse soudainement, pour des raisons très variées, corrompant un octet dans la RAM. Pour éviter cela, les mémoires sur ce genre de serveurs utilise des codes de détection et de correction d'erreur, mais le memory mirroring est parfois utilisé en complément. Si une inversion de bit survient, elle sera localisée dans une barrette. L'autre barrette peut alors prendre la relève.
Reste à détecter quelle barrette est fautive. Pour cela, les barrettes de mémoire utilisent un bit de parité pour chaque octet de la RAM. Lors d'une lecture, le bit de parité est utilisé pour savoir si une inversion de bit a eu lieu. Si c'est le cas, le bit de parité et l'octet lu ne correspondent pas, ce qui fait qu'on a une erreur de parité mémoire. Sans memory mirroring, une erreur de parité mémoire entraine un écran bleu ou un redémarrage de l'ordinateur. Mais avec memory mirroring, l'autre barrette ne sera pas touchée, ce qui fait qu'on aura une copie correcte de la donnée lue. Les bits de parité nous disent quelle barrette/donnée est fautive et laquelle est correcte. Il est même possible de remplacer la donnée fautive par la donnée correcte, il suffit simplement de faire une copie entre les deux barrettes.
Les serveurs ont souvent des cartes mères spéciales, avec de quoi mettre facilement 8 à 16 barrettes de mémoire dessus. Aussi, le memory mirroring peut être exploité à son plein potentiel. Il est possible d'avoir 16 barrettes de RAM, groupées en paires, chaque paire utilisant le memory mirroring.
Les bus mémoire à base de liaisons point à point : les barrettes FB-DIMM
[modifier | modifier le wikicode]Dans le cas le plus fréquent, toutes les barrettes d'un PC sont reliées au même bus mémoire, comme indiqué dans le schéma ci-dessous. Le bus mémoire est un bus parallèle, avec tous les défauts que ca implique quand on travaille à haute fréquence. Diverses contraintes électriques assez compliquées à expliquer font que les bus parallèles ont du mal à fonctionner à haute fréquence, la stabilité de transmission du signal est altérée.
Les barrettes mémoire FB-DIMM contournent le problème en utilisant plusieurs liaisons point à point. Il y a deux choses à comprendre. La première est que chaque barrette est connectée à la suivante par une liaison point à point, comme indiqué ci-dessous. Il n'y a pas de bus sur lequel on connecte toutes les barrettes, mais une série de plusieurs liaisons point à point. Les commandes/données passent d'une barrette à l'autre jusqu'à destination. Par exemple, une commande SDRAM part du contrôleur mémoire, passe d'une barrette à l'autre, avant d'arriver à la barrette de destination. Même chose pour les données lues depuis les DRAM, qui partent de la barrette, passent d'une barrette à la suivante, jusqu’à arriver au contrôleur mémoire.
Ensuite, les liaisons point à point sont au nombre de deux par barrette : une pour la lecture (northbound channel), l'autre pour l'écriture (southbound channel). Chaque barrette est reliée aux liaisons point à point par un circuit de contrôle qui fait l'interface. Le circuit de contrôle s'appelle l'Advanced Memory Buffer, il vérifie si chaque transmission est destinée à la barrette, et envoie la commande/donnée à la barrette suivante si ce n'est pas le cas.

L'avantage de cette organisation est que l'on peut facilement brancher beaucoup de barrettes mémoire sur la carte mère. Avec un bus parallèle, il est difficile de mettre plus de 4 barrettes mémoire. Plus on insère de barrettes de mémoire, plus la stabilité du signal transmis avec un bus parallèle se dégrade. Cela ne pose pas de problème quand on rajoute des barrettes sur la carte mère, car elles sont conçues pour que le signal reste exploitable même si tous les slots mémoire sont remplis. Mais cela fait qu'on a rarement plus de 4 slots mémoire par carte mère. Avec des barrettes FB-DIMM, on peut monter facilement à 8 ou 16 barrettes.