L’adressage des disques ATA et SCSI

Le thème de l’adressage des disques durs n’est pas très original, et a été très bien traité ailleurs, spécialement en anglais (le meilleur exemple étant certainement Charles M. Kozierok, Hard Disk Geometry and Low-Level Data Structures). Néanmoins, il a été bien plus souvent très mal traité, et comme c’est un élément important du sujet des interfaces disques, je vais essayer d’en donner un exposé.

La géométrie d’un disque

La structure d’un disque peut s’expliquer en terme de nombre de cylindres (ou piste par surface), de têtes de lecture/écriture (au plus deux par plateau, soit une par surface) et de secteurs par piste. Avec la taille des disques actuellement disponibles sur le marché, seul le contrôleur intégré au disque dur utilise les valeurs cylindres/têtes/secteurs (CHS, cylinders/heads/sectors) pour spécifier l’emplacement des données sur le disque. Pour une requête de lecture ou d’écriture, le système d’exploitation (qui peut être le BIOS) utilise à la place un adressage dit LBA ( lang="en">Logical Block Addressing) : au lieu d’indiquer la position recherchée par une valeur CHS, il donne simplement un numéro de secteur, la totalité du disque étant divisée en secteurs, sans précision quant aux cylindres et aux têtes de lecture (c’est le contrôleur intégré qui connaît cette information).

L’adressage LBA a toujours été le seul utilisé par l’interface SCSI, avec une valeur 32-bit pour le numéro de secteur, soit 4 294 967 296 secteurs adressables. Chaque secteur [1] d’un disque dur ayant une valeur de 512 octets [2], l’interface SCSI peut adresser des disques durs d’une capacité pouvant aller jusqu’à 2 199 023 255 552 octets, soit 2 To [3].

Pour l’interface ATA, il en va différemment : tout d’abord l’adressage LBA n’est apparu que dans les spécifications ATA-2, où il était alors 28 bits, et ensuite, compte tenu justement de cette limite à 28 bits (ne permettant d’adresser que des disques d’une taille maximum de 137 438 953 472 octets, soit 137 Go), la future norme ATA-6 définit une nouvelle valeur 48 bits pour l’adressage LBA [4].

Le BIOS

Sur un compatible PC, il y a plusieurs façons pour une application d’accéder à un disque dur : si c’est une application MS-DOS, elle passera par le BIOS en utilisant son interruption 13h, l’Int 13h (voir l’Annexe), soit en faisait appel à MS-DOS comme intermédiaire (plus simple), soit en appelant directement l’Int 13h. Si c’est une application pour un système d’exploitation moderne (utilisant le mode 386 du processeur, cf. Le BIOS : un firmware archaïque dans l’architecture x86), elle utilisera les services de ce système d’exploitation. Dans le deuxième cas, cela suppose que le système d’exploitation est déjà lancé, et c’est là le hic : on pourrait croire qu’un système n’ayant aucun lien avec MS-DOS (c’est-à-dire, pas Windows 95/98/ME mais BeOS, Linux, Windows 2000/NT…) n’a pas besoin du BIOS. C’est malheureusement faux dans la plupart des cas : les bootloaders (programme de lancement d’un système d’exploitation) sont généralement conçus comme reposant sur le BIOS pour leur accès au matériel. Seul le bootloader nuni dispose de ses propres pilotes d’accès aux disques durs. Mais pour les autres (comme le fameux lilo) le disque de démarrage doit pouvoir être accessible par l’Int 13h pour permettre au bootloader d’y lire le code lançant le système d’exploitation. Et donc, toute limitation du BIOS à d’importantes répercussions : si le BIOS ne peut accéder au disque renfermant le système d’exploitation, le système ne pourra pas être démarré. De même, si le bootloader ne sait pas utiliser l’Int 13h étendue, l’Int 13h ne lui donnera accès qu’à une partie du disque (c’était par exemple le cas avec lilo, excellent dans sa capacité à booter de nombreux systèmes d’exploitation, mais seulement capable jusqu’à la version 21.4 d’accéder à l’Int 13h classique, et donc aux 1024 premiers cylindres du disque – voir ci-après pour plus d’explications).

Les barrières du BIOS

Tous les problèmes d’adressage des disques durs sur compatible PC viennent précisément du fait que l’adressage LBA n’était pas incorporé dès le départ à l’interface : c’est-à-dire que le système d’exploitation devait utiliser l’adressage CHS. Ce qui n’est pas forcément très mauvais en soi, mais les concepteurs du BIOS, dans un manque navrant de vision à long terme, n’affectèrent à l’interruption Int 13h pour spécifier les valeurs cylindres, têtes et secteurs respectivement que 10 bits, 8 bits et 6 bits, soit une limite de 1024 cylindres, 256 têtes et 64 secteurs (en fait 63), ce qui permet d’adresser théoriquement un disque de seulement 8 455 716 864 octets (8,4 Go). Quand on sait qu’un disque de plus de 5 plateaux (10 têtes) est rare, que de plus l’interface ATA spécifie une limite de 16 têtes, et que les disques actuels ont un nombre de secteurs variable par piste (et de toute façon, bien supérieur à 63), on comprend que dans la pratique le BIOS ne puisse adresser que des disques d’une capacité bien inférieure. La solution aurait été de passer à l’adressage LBA, mais comme MS-DOS n’utilisait que l’adressage CHS [5], pour des raisons de compatibilité, un subterfuge a été trouvé : appelé ECHS ( lang="en">Extended CHS) ou Large (dans de nombreux Setup de BIOS) ou encore « LBA assistée » (ce qui ne peut qu’induire en erreur, l’ECHS n’ayant rien à voir avec le LBA), le procédé consiste pour l’Int 13h à présenter une géométrie interprétée où le nombre de têtes est artificiellement augmenté et le nombre de cylindres artificiellement diminué par rapport à la géométrie logique [6] permettant de donner plus de chances d’atteindre la limite théorique de l’Int 13h (plusieurs problèmes d’implémentations défectueuses par divers BIOS ont créé des barrières empêchant d’atteindre cette limite des 8,4 Go. Elles ont toutes été très bien exposées dans Charles M. Kozierok, Hard Disk BIOS and Capacity Factors.

Aujourd’hui

L’utilisation de l’Int 13h, même retournée dans tous les sens possibles, ne permettant que d’adresser des disques de 8,4 Go, les fabricants de BIOS ont finalement été forcés d’implémenter l’Int 13h étendue dans leur BIOS. Les systèmes ne pouvant utiliser le mode LBA (MS-DOS 6.22-Windows 3.11, Windows NT 3.x, Windows NT 4 avant le SP4…) ne comptent plus beaucoup.

Avec l’ATA-2 (acquis depuis 1996, mais avec le LBA mal implémenté pendant longtemps), et avec l’Int 13h étendue, l’ATA a rejoint le SCSI en partageant le même système d’adressage. Avec les nouveaux systèmes d’exploitation et les bootloaders utilisant l’adressage LBA, l’adressage CHS et surtout l’Int 13h classique ne seront plus qu’un mauvais souvenir. [7]

Annexes

Int 13h / Int 13h étendue

Le BIOS permet à une application d’accéder au matériel par l’intermédiaire de ses services, appelés interruptions, et désignés par un numéro en hexadécimal. L’interruption utilisée pour accéder aux disques depuis l’IBM PC/AT est l’interruption Int 13h. Pour l’Int 13h étendue, un document produit par IBM et Microsoft, INT 13 Extensions, existait sous forme confidentielle depuis plusieurs années, mais ne se développa vraiment qu’à partir de 1995, quand Phoenix reprit et améliora le standard sous le nom Enhanced Disk Drive Specifications (IBM/MS INT 13 Extensions v2.0 est équivalent à Phoenix Enhanced Disk Drive Specifications v1.0). Toutefois, l’EDD ne devient répandue qu’à partir de 1999. L’Int 13h étendue ajoute les fonctions 41h à 49h, 4Eh et 50h et permet d’utiliser une adresse LBA d’une longueur pouvant aller jusqu’à 64 bits (ce qui laisse de la marge pour les standards futurs).

Pour rester compatible avec des programmes ne comprenant que l’accès CHS, le BIOS peut présenter des paramètres CHS ou ECHS au niveau de l’Int 13h et des paramètres LBA au niveau de l’Int 13h étendue.

Le menu de configuration du BIOS

Il existe dans le Setup du BIOS, généralement dans le menu principal, toute une partie consacrée à la déclaration de paramètres pour les disques ATA présents sur l’ordinateur. L’ensemble vient de Western Digital qui avait proposé par le passé un EIDE BIOS (qui n’a rien à voir avec l’Int 13h étendue et l’EDD, d’où une grande confusion et la complexité de ce qui va suivre). Il s’agit de déterminer deux choses :

  • spécifier manuellement quels vont être les paramètres CHS ou ECHS (options Type et suivantes) qui seront présentés par l’Int 13h (très dangereux pour vos données, voir ci-après). On peut dépasser ici les limites de l’Int 13h (1024 cylindres, 256 têtes et 63 secteurs), mais le surplus ne sera pas accessible aux applications utilisant l’Int 13h classique. Accessoirement, il y a souvent une option pour spécifier le « landz » (landing zone) ou le « precomp » (write precompensation cylinder) : utile si on a un très vieux disque, sinon, mieux vaut ne pas y toucher – consultez les spécifications de votre disque si vous en avez besoin).
  • spécifier comment le BIOS communique avec le contrôleur disque intégré (option Mode : choisir LBA pour le LBA, et Normal ou Large pour le CHS).

On a parfois présenté ce dernier paramètre comme servant à dépasser les barrières du BIOS : alors que ce qui est important pour dépasser les dites barrières, c’est de pouvoir communiquer une adresse LBA au BIOS. Il n’y a que l’Int 13h étendue qui le permette – quand le BIOS utilise un adressage CHS pour communiquer avec le contrôleur disque intégré, il peut spécifier 65 536 cylindres, 16 têtes et 256 secteurs, permettant d’adresser des disques de 137 Go. Ce n’est donc pas la façon dont le BIOS communique avec le contrôleur disque intégré qui importe mais bien celle qu’il utilise avec les applications par son interruption 13h.

En terme de performance, l’impact d’un mode ou d’un autre ne sera visible qu’avec un système qui utilise le BIOS comme pilote (MS-DOS et compatible), et dans ce cas, tout dépend du firmware du disque dur : s’il est récent, il sera probablement optimisé pour un accès LBA, et donc choisir LBA pour le Mode améliorera les accès disques sous MS-DOS. Sinon, il vaut mieux choisir Normal ou Large. Mais attention ! De par les spécifications de Western Digital, changer les paramètres d’adressage par le BIOS change malheureusement aussi les paramètres CHS ou ECHS qui seront présentés par l’Int 13h. Si des données sont déjà inscrites sur les disques concernées, cela peut résulter en la perte de celles-ci.

Donc si les paramètres cylindres/têtes/secteurs sont modifiés d’une façon ou d’une autre, sauvegardez vos données, détruisez les partitions existantes et reconstruisez-les à l’aide d’un utilitaire de type fdisk.

Si par chance vous n’utilisez pas de programme faisant appel à la version classique de l’Int 13h, il vaut mieux spécifier Auto pour le Type. Autrement, il faut paramétrer de façon à diminuer le nombre de cylindres (par exemple, lilo, avant la version 21.4, ne peut atteindre que les 1024 premiers cylindres).

Bien entendu, les modifications de paramètres du BIOS Setup, ainsi que l’utilisation de fdisk et de programmes similaires comme ceux décrits dans ce document sont entièrement à vos propres risques et périls.

Exemple d’un écran de Setup

Exemple d’écran de configuration, tiré du Setup d’un BIOS Award 4.51PG.


Références (autres que celles citées dans le texte) :

Enhanced Disk Drive Specifications Ver 1.1

GNU GRUB

GNU Parted

Hale Landis, How It Works: CHS Translation

Mikhail Ranish, Ranish Partition Manager

MS-DOS Partitioning Summary

Possible Data Loss with LBA and INT13 Extensions

Ralph Brown, The Interrupt list

T13/1386D, Information Technology – BIOS Enhanced Disk Drive Services (EDD)


Notes :

[1] Ne pas confondre secteur et cluster, ce dernier terme se référant à une unité d’allocation dans un système de fichiers comme le système FAT de Microsoft.

[2] Le secteur d’une disquette pouvant avoir une autre valeur, mais ce n’est guère utilisé que sur d’autres plates-formes que les compatibles PC.

[3] J’utilise pour cet article les valeurs de la norme SI pour les préfixes Téra-, Giga- et Kilo- (par exemple, un kilo vaut 1000 et non pas 1024). Voir Andries Brouwer, Large Disk HOWTO, pour plus de précisions.

[4] Ce passage à un adressage 48-bit pourrait être propre à entraîner des bouleversements assez importants, mais normalement il devrait survenir avec les premiers disques SATA (cf. Serial ATA : un futur proche ?), ce qui le noiera probablement dans le flot général des bouleversements induit par la nouvelle interface.

[5] Il a la possibilité d’utiliser l’adressage LBA depuis sa version 7.0, la version de MS-DOS incluse dans Windows 95.

[6] La géométrie logique est déjà une géométrie factice, c’est celle que présente au BIOS le contrôleur disque intégré, qui lui utilise la géométrie physique, véritable, pour adresser le disque dur proprement dit (plateaux et têtes).

[7] On doit noter toutefois que le système de partition de type MBR a une limite absolue de 4 294 967 295 (232 − 1) secteurs, à 512 (29) octets par secteurs, soit 2 199 023 255 040 octets (2 To). Pour dépasser cette limitation, il faut un nouveau système de partition.