Fonctionnement d'un ordinateur/Les solid-state drives

Un livre de Wikilivres.
Sauter à la navigation Sauter à la recherche

De nos jours, les disques durs tendent à être remplacés par des mémoires de masse dont le support de mémorisation est électronique : les solid-state drives, ou SSD. Certains SSD assez anciens utilisaient de la mémoire DDR-SDRAM, comme on en trouve dans nos PC, mais les SSD actuels sont fabriqués avec de la mémoire Flash. Il s'agit d'une forme évoluée d'EEPROM, déclinée en plusieurs versions : NOR et NAND. Les mémoires Flash sont accessibles via un bus série (de 1 bit), sauf pour quelques exceptions. A part le support de mémorisation et les circuits de conversion série-parallèle, l'organisation interne d'un SSD est similaire à celle d'une mémoire adressable.

Architecture interne d'un SSD.

Les clés USB fonctionnent exactement comme les SSDs et leurs architectures internes sont similaires.

Intérieur d'une clé USB.
1 - Connecteur USB.
2 - Contrôleur de mémoire FLASH et de port USB.
3 - Connecteurs utilisés pour divers tests.
4 - Puce de mémoire Flash.
5 - Générateur d'horloge interne.
6 - LED d'activité.
7 - Switch pour autoriser/interdire les écritures.
8 - Circuit imprimé.

Support de mémorisation[modifier | modifier le wikicode]

L'interface d'une Flash autorise plusieurs opérations : la lecture, l'écriture (ou reprogrammation, vu qu'il s'agit d'une mémoire EEPROM) et l'effacement. Si la lecture d'un byte individuel est possible, l'effacement s’effectue par paquets de plusieurs bytes, nommés blocs. Dans les mémoires NOR, il est possible de lire ou d'écrire octet par octet, chaque octet ayant une adresse. Mais sur les NAND, on ne peut pas : on est obligé de lire ou d'écrire par paquets d'octets relativement importants. Même si vous ne voulez modifier qu'un seul bit ou un seul secteur, vous allez devoir modifier un paquet de 512 à 4096 octets. Ces paquets sont appelés des pages. Si une page est vide, on peut écrire dans celle-ci sans problème, même si les autres pages du bloc sont occupées. Mais si la page contient déjà des données, on est obligé d'effacer tout le bloc. Ce problème est géré différemment suivant le SSD, comme on le verra dans la suite du cours.

Vu que les pages font plusieurs kibioctets, il est évident que les Flash NAND ne peuvent pas utiliser une interface parallèle : vous imaginez des bus de 4096 bits ? À la place, elles sont obligées d'utiliser des bus série pour envoyer ou récupérer les pages bit par bit. Pour faire la conversion série-parallèle, chaque plane ou bloc contient un registre à décalage série-parallèle : le registre de page.

Le support de mémorisation peut être optimisé de manière à gagner en performances, les optimisations étant souvent les mêmes que celles utilisées sur les mémoires RAM : entrelacement, pipeline, etc. Pour ce qui est du pipeline, les Flash se limitent à recevoir une requête de lecture/écriture pendant que la Flash effectue la précédente. Pour cela, le contrôleur de la Flash doit être modifié et chaque plane/bloc se voit attribuer un registre de cache, pour mettre en attente une écriture pendant que la précédente utilise le registre de page. La donnée en cours d'écriture est copiée du registre de page sur le support de mémorisation, tandis que le registre de cache accumule les bits de la prochaine donnée à écrire. Pour une lecture, c'est la même chose : le contenu du registre de cache peut être envoyé sur la sortie série, pendant qu'une autre donnée est copiée du support de mémorisation vers le registre de page. Évidemment, le contenu des registres de page et de cache est échangé à chaque début de lecture/écriture. Avec quelques optimisations, on peut se passer de recopies en échangeant le rôle des registres : le registre de page devient le registre de cache, et vice versa.

Certaines Flash permettent d'effectuer des copies rapides entre pages, opérations très courantes sur les SSD, sans passer par le registre de page. Mais cela a un cout : il faut que les pages en question soient reliées avec un lien série pour transférer les données de page en page. Et plus une mémoire Flash contient de pages, plus le nombre d'interconnexions augmente. Pour limiter le nombre d’interconnexions, ces copies rapides entre page ne sont possibles qu'à l'intérieur d'une plane ou d'un die : impossible de copier rapidement des données mémorisées dans des dies ou planes différents.

Flash transaction layer[modifier | modifier le wikicode]

Le système d'exploitation transmet des adresses LBA au SSD, qui sont traduites en adresses de mémoire FLASH par le contrôleur de SSD. La majorité des SSD (si ce n'est tous) partent du principe qu'un secteur est égal à une page. Dans le cas le plus simple, la correspondance entre adresse LBA et adresse de mémoire Flash est fixée une fois pour toutes à la construction du SSD : on parle alors de correspondance statique. Cette correspondance statique effectue les écritures en place, à savoir que toute réécriture d'une page demande d'effacer le bloc complet. On doit donc sauvegarder temporairement le bloc, mettre à jour la page à écrire dans le bloc, effacer me bloc et réécrire le résultat. Pour cela, le registre de page est agrandi pour pouvoir stocker un bloc complet. Or, les cellules de mémoire Flash ne peuvent supporter qu'un nombre limité d'effacements. Or, avec une correspondance statique, certaines cellules seront nettement plus souvent réécrites que d'autres : après tout, certains fichiers sont très souvent accédés, tandis que d'autres sont laissés à l'abandon. Certaines cellules vont donc tomber en panne rapidement, ce qui réduit la durée de vie du SSD.

Pour régler ces problèmes, certains contrôleurs utilisent une correspondance dynamique : ils font ce que l'on appelle du relocate on write. Avec cette correspondance dynamique, la page à écrire est écrite dans un bloc vide, et l'ancienne page est marquée invalide. L'effacement des blocs invalides est effectué plus tard, quand le SSD est inutilisé. Pour cela, le SSD possède une liste des pages vierges et des blocs en attente d'effacement. La position d'une adresse LBA dans la mémoire Flash change donc à chaque écriture. Le SSD doit donc se souvenir à quelle page ou bloc correspond chaque adresse LBA, grâce àune table de correspondance mémorisée soit dans une mémoire non volatile, soit dans les premiers secteurs du SSD. Reste que cette correspondance d'adresse peut se faire de trois manières :

  • soit le contrôleur travaille au niveau du bloc ;
  • soit il travaille au niveau de la page ;
  • soit il utilise une technique hybride.

Certains contrôleurs fonctionnent par page : un secteur peut se voir attribuer n'importe quelle page, peu importe le bloc où se situe la page. Avec d'autres contrôleurs, des secteurs consécutifs sont placés dans le même bloc, dans des pages différentes. La position de la page dans un bloc est déterminée statiquement, mais le bloc dans lequel placer la donnée change. Vu qu'il y a plusieurs pages par bloc, la table prend donc nettement moins de place que son équivalent par page. Il existe des techniques hybrides, qui vont utiliser une table de correspondances par bloc pour les lectures, avec un mise à jour par page lors de l'écriture.

Wear leveling[modifier | modifier le wikicode]

Certains contrôleurs de SSD utilisent une technique pour augmenter la durée de vie du SSD : le wear leveling, ou égalisation d'usure. L'idée est simple : on va chercher à répartir les écritures de manière à ce que tous les blocs soient « usés » de la même façon : on va faire en sorte que le nombre d'écritures soit identique dans tous les blocs. Pour cela, il suffit de déplacer les données fortement utilisées dans des blocs pas vraiment usés. Vu que les données fréquemment utilisées sont présentes sur des blocs très usés, qui ont un grand nombre d'écriture, on peut considérer que le wear leveling consiste à déplacer les données des blocs usés dans les blocs relativement intacts.

Le plus simple est le wear leveling dynamique, où les blocs sont déplacés lorsqu'ils sont réecrits. Quand on veut réécrire une donnée, on va choisir un bloc qui a relativement peu d'écritures a son actif. Pour cela, le contrôleur de SSD doit mémoriser le nombre d'écritures de chaque bloc dans une mémoire non-volatile. Avec ce wear leveling dynamique, les données qui ne sont pas réécrites souvent ne bougent quasiment jamais du bloc qui leur est assigné, ce qui est loin d'être optimal. Il vaut mieux déplacer des telles données sur des blocs très usés, et allouer leur emplacement initial à une donnée fréquemment mise à jour. C'est ce principe qui se cache derrière le wear leveling statique. Il va de soi que le contrôleur doit alors mémoriser la liste des blocs peu utilisés, en plus de la liste des blocs vides.

L'amplification d'écriture[modifier | modifier le wikicode]

Avec correspondance dynamique, chaque écriture gaspille un bloc ou une page, qui contient l'ancienne version de la donnée écrite. Si un secteur est écrit six fois de suite, six blocs ou six pages seront utilisés pour mémoriser ce secteur dont un seul contiendra une donnée valide : ce qui fait un gâchis de cinq blocs/pages. De plus, le SSD peut aussi profiter des périodes d'inactivité du SSD pour réorganiser les données sur le disque dur, de manière à obtenir des blocs totalement vides qu'il pourra effacer. Ce ramasse-miettes a toutefois un défaut : il est obligé de migrer des pages dans la mémoire Flash, ce qui est à l'origine d'écritures supplémentaires. De plus, le wear leveling ajoute des écritures supplémentaires. Ce phénomène s'appelle l'amplification d'écriture.

Amplification d'écriture sur un SSD.

Pour limiter la casse, certains SSD contiennent des Flash en rab, invisibles du point de vue du système d'exploitation : on parle de sur-approvisionnement. Ces Flash en rab peuvent aussi servir si jamais une mémoire Flash tombe en panne après avoir été trop souvent écrite. Le remplacement s'effectue simplement en mettant à jour la table de correspondances.

L'amplification d'écriture est à l'origine d'un autre problème, qui concerne les situations où l'on veut effacer des données sans que qui que ce soit ne puisse les récupérer. Avec des technologies de pointes, il est parfois possible de récupérer physiquement des données présentes sur un disque dur, même si celui-ci est partiellement détruit ou que les données en question ont été écrasées. Pour éviter cela, il vous suffit de réécrire des données aléatoires ou des zéros sur les secteurs concernés plusieurs centaines ou milliers de fois de suite. Mais si vous essayez de faire cela avec des SSD, cela n'effacera pas les données : cela se contentera de prendre des blocs vides pour écrire les données aléatoires dedans. Pour régler ce problème, certains SSD modernes possèdent des commandes qui permettent de remettre à zéro l'intégralité du disque dur, ou d'effacer des pages ou blocs bien précis.