Page suivante Page précédente Table des matières

4. Accès à un disque dur

Si on veut lire ou écrire quelque chose à partir de, ou sur un disque dur, il faut spécifier une position sur ce disque, en donnant par exemple un numéro de secteur ou de bloc. Si le disque dur est de type SCSI, alors ce numéro de secteur va directement au moteur de commande SCSI et est compris par le disque. Si le disque dur est de type IDE et qu'il utilise le mode LBA, alors il se passe exactement la même chose. Mais si le disque dur est vieux, RLL, MFM ou IDE avant l'apparition du LBA, alors l'électronique qui lui est attachée attend un triplet (cylindre, tête, secteur) pour désigner l'endroit voulu.

La correspondance entre la numérotation linéaire et cette notation tridimensionnelle est la suivante : pour un disque dur avec C cylindres, H têtes et S secteurs/pistes, la position (c,h,s) en 3D, ou la notation CHS, est la même que la position c*H*S + h*S + (s-1) en notation linéaire ou bien LBA. (Le -1 est dû au fait que traditionnellement les secteurs sont numérotés à partir de 1 et non 0, dans cette notation 3D.)

En conséquence, pour permettre des accès à un très vieux disque non-SCSI, nous devons connaître sa géométrie, c'est-à-dire les valeurs de C, H et S.

4.1 Accès disques du BIOS et la limite des 1024 cylindres

Linux ne se sert pas du BIOS, mais d'autres systèmes d'exploitation le font. Le BIOS, qui existait avant le temps du LBA, offre avec INT13 des routines d'Entrée/Sortie disque qui prennent (c,h,s) comme arguments. (Plus précisément : AH sélectionne la fonction à exécuter, CH correspond aux 8 bits de poids faible du numéro de cylindre, CL a dans ses bits 7-6 les deux bits de poids fort de ce même numéro et dans ses bits 5-0 le numéro du secteur, DH est le numéro de la tête, et DL est le numéro du lecteur (80h ou 81h). Cela explique en partie l'agencement de la table des partitions.)

Donc, nous obtenons un CHS codé sur trois octets, avec 10 bits pour le numéro du cylindre, 8 bits pour le numéro de tête, et 6 bits pour le numéro de secteur sur la piste (numéroté de 1 à 63). Il s'ensuit que le numéro de cylindre peut prendre des valeurs allant de 0 à 1023 et que le BIOS ne peut pas adresser plus de 1024 cylindres.

Les logiciels DOS et Windows n'ont pas évolué quand furent introduits les disques IDE avec le support LBA, et ont toujours eu besoin du soutien d'une géométrie pour gérer les disques durs, même quand cela n'a plus été nécessaire pour effectuer des Entrées/Sorties, mais uniquement pour converser avec le BIOS. Cela signifie bien sûr que Linux a besoin du support de la géométrie du disque dur quand il est nécessaire de communiquer avec le BIOS ou avec d'autres systèmes d'exploitation, même sur des disques durs modernes.

Cet état de choses a duré pendant à peu près quatre ans. Ont alors commencé à apparaître sur le marché des disques durs qui ne pouvaient plus être adressés avec les fonctions INT13 (à cause du fait que 10+8+6=24 bits pour (c,h,s) ne peuvent pas adresser plus de 8,5 Go), et une nouvelle interface BIOS a été créée : les dénommées Fonctions INT13 Etendues, où DS:SI pointe sur un paquet représentant l'adressage du disque sur 16 octets, qui contient un nombre absolu de blocs commençant par 8 octets.

Tout doucement, le monde Microsoft semble aller vers une utilisation de ces Fonctions INT13 Etendues. Probablement, dans quelques années, plus aucun système moderne placé dans un ordinateur moderne n'aura besoin du concept de `géométrie de disque dur'.

4.2 Histoire du BIOS et des limites de l'IDE

Spécification ATA (pour les disques durs IDE) - la limite des 137 Go

Au plus 65536 cylindres (numérotés de 0 à 65535), 16 têtes (numérotées de 0 à 15), 255 secteurs par piste (numérotés de 1 à 255), pour une capacité totale maximale de 267386880 secteurs (de 512 octets chacun), ce qui fait 136902082560 octets (137 Go). Ce n'est pas encore un problème (en 1999), mais ça le deviendra dans quelques années.

BIOS Int 13 - la limite des 8,5 Go

Au plus 1024 cylindres (numérotés de 0 à 1023), 256 têtes (numérotées de 0 à 255), 63 secteurs par piste (numérotés de 1 à 63) pour une capacité totale maximale de 8455716864 octets (8,5 Go). De nos jours, cela est une sérieuse limitation. Cela signifie que DOS ne peut utiliser les actuels disques de grande capacité.

La limite des 528 Mo

Si les mêmes valeurs c,h,s sont utilisées pour les appels aux fonctions Int13 du BIOS et pour les opérations d'Entrées/Sorties du disque dur, alors les deux limitations s'ajoutent, et l'on ne peut utiliser au plus que 1024 cylindres, 16 têtes, 63 secteurs par piste, ce qui donne une capacité totale maximale de 528482304 octets (528 Mo), l'abominable limite des 504 Mio pour DOS avec un vieux BIOS. Cela a commencé à poser des problèmes aux alentours de 1993, et les gens ont eu recours à toutes sortes de bidouillages, aussi bien au niveau matériel (LBA), qu'au niveau du microprogramme (NdT : le `firmware') (les conversions du BIOS), ou qu'au niveau logiciel (les gestionnaires de disques durs). Le concept de `conversion' a été inventé (1994) : un BIOS pouvait utiliser une géométrie quand il s'adressait au lecteur, et une autre géométrie, fausse celle-là, quand il parlait à DOS, et faire des conversions de l'une à l'autre.

La limite des 2,1 Go (avril 1996)

Quelques vieux BIOS n'utilisent qu'un champ de 12 bits en RAM CMOS pour donner le nombre de cylindres. De ce fait, ce nombre peut être au plus égal à 4095, et l'on ne peut accéder qu'à 4095*16*63*512=2113413120 octets. Le fait d'avoir un disque dur de plus grande capacité se traduirait par un plantage au moment du démarrage. Cela a pour effet de rendre les disques avec une géométrie de 4092/16/63 assez populaires. Et encore de nos jours, beaucoup de gros disques durs ont un cavalier qui permet de faire croire qu'ils ont une géométrie de 4092/16/63. Vous pouvez également jeter un coup d'oeil à la page plus de 2 Go.

La limite des 3,2 Go

Il y avait un bug dans la gestion des BIOS Phoenix 4.03 et 4.04 qui bloquait le système lors de la configuration du CMOS pour des disques durs ayant une capacité supérieure à 3277 Mo. Jetez un oeil à la page plus de 3 Go.

La limite des 4,2 Go (février 1997)

Une conversion simple du BIOS (ECHS = CHS Etendu, parfois appelé `Large disk support' ou simplement `Large') fonctionne en doublant le nombre de têtes et en divisant par deux le nombre de cylindres montrés au DOS, de manière répétée, jusqu'à ce que le nombre de cylindres soit au plus égal à 1024. Maintenant, DOS et Windows 95 ne peuvent pas supporter 256 têtes de lecture, et donc, dans le cas fréquent où le disque dit avoir 16 têtes, cela signifie que cette moulinette ne fonctionne que jusqu'à une taille de 8192*16*63*512=4227858432 octets (avec une fausse géométrie de 1024 cylindres, 128 têtes et 63 secteurs par piste). Remarquez que ECHS ne modifie pas le nombre de secteurs par piste, donc si ce n'est pas 63, la limite sera encore plus basse. Voyez la page plus de 4 Go.

La limite des 7,9 Go

Des BIOS un peu plus malins que les autres évitent le problème précédent en ajustant d'abord le nombre de têtes à 15 (`revised ECHS'), de façon qu'une fausse géométrie comportant 240 têtes soit obtenue, valable jusqu'à une taille de 1024*240*63*512=7927234560 octets.

La limite des 8,4 Go

En définitive, si le BIOS fait tout ce qu'il peut pour réussir la conversion, et utilise 255 têtes et 63 secteurs par piste (`assisted LBA' ou simplement `LBA') il peut atteindre 1024*255*63*512=8422686720 octets, soit légèrement moins que la précédente limite de 8,5 Go, cela parce que les géométries avec 256 têtes doivent être évitées. (Cette conversion utilisera pour le nombre de têtes la première valeur H, prise dans la suite 16, 32, 64, 128, 255, pour laquelle la capacité totale du disque dur tient dans 1024*H*63*512, et calcule alors le nombre de cylindres C comme étant égal à la capacité totale divisée par (H*63*512).)

La limite des 33,8 Go (Août 1999)

Le prochain obstacle se présente avec une taille de 33,8 Go. Le problème est qu'avec les 16 têtes et les 63 secteurs/piste par défaut, ça donne un nombre de cylindres supérieur à 65535, qui ne rentre pas dans un short. Peut-être qu'aucun BIOS actuel n'est capable de supporter de tels disques durs. Linux a encore besoin d'un patch.

Pour une autre discussion sur ce sujet, vous pouvez consulter la page Breaking the Barriers, et pour encore plus de détails, IDE Hard Drive Capacity Barriers.

Les disques durs de plus de 8,4 Go sont supposés donner leur géométrie comme étant 16383/16/63. Cela signifie en fait que la `géométrie' est obsolète, et qu'elle ne peut plus servir à calculer la taille totale d'un disque dur.


Page suivante Page précédente Table des matières