Adressage des disques durs

Cylindre-tête-secteur

 

Histoire

Les premiers disques durs utilisés dans les PC, tels que les disques MFM et RLL, divisaient chaque cylindre en un nombre égal de secteurs, de sorte que les valeurs CHS correspondaient aux propriétés physiques du disque. Un disque avec un tuple CHS de 500 4 32 aurait 500 pistes par côté sur chaque plateau, deux plateaux (4 têtes), et 32 secteurs par piste, avec un total de 32 768 000 octets (31,25 MiB).

Les lecteurs ATA/IDE étaient beaucoup plus efficaces pour le stockage des données et ont remplacé les lecteurs MFM et RLL, désormais archaïques. Ils utilisent l'enregistrement par zone de bits (ZBR), où le nombre de secteurs divisant chaque piste varie en fonction de l'emplacement des groupes de pistes sur la surface du plateau. Les pistes les plus proches du bord du plateau contiennent plus de blocs de données que les pistes proches de la broche, car il y a plus d'espace physique dans une piste donnée près du bord du plateau. Ainsi, le schéma d'adressage du SHC ne peut pas correspondre directement à la géométrie physique de ces lecteurs, en raison du nombre variable de secteurs par piste pour les différentes régions d'un plateau. Pour cette raison, de nombreux lecteurs ont toujours un surplus de secteurs (d'une taille inférieure à un cylindre) à la fin du lecteur, puisque le nombre total de secteurs se termine rarement, voire jamais, sur une limite de cylindre.

Un lecteur ATA/IDE peut être configuré dans le BIOS du système avec n'importe quelle configuration de cylindres, têtes et secteurs qui ne dépasse pas la capacité du lecteur (ou du BIOS), puisque le lecteur convertira toute valeur CHS donnée en une adresse réelle pour sa configuration matérielle spécifique. Cela peut toutefois poser des problèmes de compatibilité.

Pour les systèmes d'exploitation tels que Microsoft DOS ou les anciennes versions de Windows, chaque partition doit commencer et se terminer à la limite d'un cylindre. Seuls certains des systèmes d'exploitation les plus modernes (dont Windows XP) peuvent ignorer cette règle, mais cela peut néanmoins poser des problèmes de compatibilité, notamment si l'utilisateur souhaite effectuer un double démarrage sur le même disque. Microsoft ne suit pas cette règle avec les outils de partition de disque interne depuis Windows Vista.

Définitions

Un dispositif appelé tête lit et écrit des données dans un disque dur en manipulant le support magnétique qui compose la surface d'un plateau de disque associé. Naturellement, un plateau a deux côtés et donc deux surfaces sur lesquelles les données peuvent être manipulées ; il y a généralement deux têtes par plateau, une par côté. (Parfois, le terme côté est substitué à celui de tête, car les plateaux peuvent être séparés de leurs assemblages de têtes, comme c'est le cas pour les supports amovibles d'un lecteur de disquettes).

L'adressage CHS pris en charge dans le code des BIOS compatibles IBM-PC utilisait huit bits pour - théoriquement jusqu'à 256 têtes comptées de la tête 0 à 255 (FFh). Cependant, un bogue dans toutes les versions de MS-DOS/PC DOS jusqu'à la version 7.10 incluse fait que ces systèmes d'exploitation se plantent au démarrage, s'ils rencontrent des volumes avec 256 têtes. Par conséquent, tous les BIOS compatibles n'utiliseront que des mappages comportant jusqu'à 255 têtes (00h..FEh), y compris dans les géométries virtuelles 255×63.

Cette bizarrerie historique peut affecter la taille maximale du disque dans l'ancien code INT 13h du BIOS ainsi que dans les anciens systèmes d'exploitation PC DOS ou similaires :

(512 octets/secteur)×(63 secteurs/piste)×(255 têtes (pistes/cylindre) )×(1024 cylindres)=8032.5 MiB, mais en réalité (512 octets/secteur)×256×63×1024=8064 MiB donne ce qui est connu comme la limite de 8 GiB. Dans ce contexte, la définition pertinente de 8 GiB = 8192 MiB est une autre limite incorrecte, car elle nécessiterait un SHC 512×256×64 avec 64 secteurs par piste.

Les pistes et les cylindres sont comptés à partir de 0, c'est-à-dire que la piste 0 est la première piste (la plus extérieure) sur les disquettes ou autres disques cylindriques. L'ancien code BIOS supportait dix bits dans l'adressage CHS avec jusqu'à 1024 cylindres (1024=210). En ajoutant six bits pour les secteurs et huit bits pour les têtes, on obtient les 24 bits pris en charge par l'interruption 13h du BIOS. La soustraction du numéro de secteur 0 non autorisé dans les pistes 1024×256 correspond à 128 MiB pour une taille de secteur de 512 octets (128 MiB=1024×256×(512 octets/secteur)) ; et 8192-128=8064 confirme la limite (approximative) de 8 GiB.

L'adressage CHS commence à 0/0/1 avec une valeur maximale de 1023/255/63 pour 24=10+8+6 bits, ou 1023/254/63 pour 24 bits limités à 255 têtes. Les valeurs CHS utilisées pour spécifier la géométrie d'un disque doivent compter le cylindre 0 et la tête 0, ce qui donne une valeur maximale de (1024/256/63 ou) 1024/255/63 pour 24 bits avec (256 ou) 255 têtes. Dans les tuples CHS spécifiant une géométrie, S signifie en fait secteurs par piste, et lorsque la géométrie (virtuelle) correspond toujours à la capacité, le disque contient C×H×S secteurs. Au fur et à mesure de l'utilisation de disques durs plus grands, un cylindre est également devenu une structure de disque logique, normalisée à 16 065 secteurs (16065=255×63).

L'adressage CHS avec 28 bits (EIDE et ATA-2) autorise huit bits pour les secteurs commençant toujours à 1, c'est-à-dire les secteurs 1...255, quatre bits pour les têtes 0...15, et seize bits pour les cylindres 0...65535. Il en résulte une limite d'environ 128 GiB ; en fait 65536×16×255=267386880 secteurs correspondant à 130560 MiB pour une taille de secteur de 512 octets. Les 28=16+4+8 bits de la spécification ATA-2 sont également couverts par la liste d'interruptions de Ralf Brown, et un ancien projet de travail de cette norme maintenant expirée a été publié.

Avec une ancienne limite BIOS de 1024 cylindres et la limite ATA de 16 têtes, l'effet combiné était de 1024×16×63=1032192 secteurs, c'est-à-dire une limite de 504 MiB pour une taille de secteur de 512. Les schémas de conversion du BIOS connus sous le nom d'ECHS et d'ECHS révisé atténuaient cette limite en utilisant 128 ou 240 têtes au lieu de 16, réduisant simultanément le nombre de cylindres et de secteurs pour qu'ils tiennent dans 1024/128/63 (limite ECHS : 4032 MiB) ou 1024/240/63 (limite ECHS révisé : 7560 MiB) pour le nombre total donné de secteurs sur un disque.

Mappage CHS vers LBA

Les tuples du SHC peuvent être mappés sur des adresses LBA (Logical Block Addressing) en utilisant la formule suivante :

Où est l'adresse LBA, est le nombre de têtes sur le disque, est le nombre de secteurs par piste, et est l'adresse CHS.

La formule du numéro de secteur logique dans les normes ECMA-107 et ISO/IEC 9293:1994 (remplaçant la norme ISO 9293:1987) pour les systèmes de fichiers FAT correspond exactement à la formule LBA donnée ci-dessus : Logical Block Address et Logical Sector Number (LSN) sont des synonymes. La formule n'utilise pas le nombre de cylindres, mais nécessite le nombre de têtes et le nombre de secteurs par piste dans la géométrie du disque, car le même tuple CHS adresse différents numéros de secteurs logiques selon la géométrie. Exemples :

    Pour la géométrie 1020 16 63 d'un disque avec 1028160 secteurs CHS 3 2 1 est LBA 3150=(3* 16+2)* 63
    Pour la géométrie 1008 4 255 d'un disque avec 1028160 secteurs CHS 3 2 1 est LBA 3570=(3* 4+2)*255
    Pour la géométrie 64 255 63 d'un disque avec 1028160 secteurs CHS 3 2 1 est LBA 48321=(3*255+2)* 63
    Pour la géométrie 2142 15 32 d'un disque avec 1028160 secteurs CHS 3 2 1 est LBA 1504=(3* 15+2)* 32

Pour aider à visualiser le séquençage des secteurs dans un modèle LBA linéaire, notez que ;

    Le premier secteur LBA est le secteur # zéro, le même secteur dans un modèle CHS est appelé secteur # un.
    Tous les secteurs de chaque tête/piste sont comptés avant de passer à la tête/piste suivante.
    Toutes les têtes/pistes d'un même cylindre sont comptées avant de passer au cylindre suivant.
    La moitié extérieure d'un disque dur entier serait la première moitié du disque.

En 2002, la spécification ATA-6 a introduit une option d'adressage par bloc logique de 48 bits et a déclaré l'adressage CHS obsolète, tout en autorisant la mise en œuvre des traductions ATA-5. Sans surprise, la formule de traduction de CHS en LBA donnée ci-dessus correspond également à la dernière traduction CHS de l'ATA-5. Dans la spécification ATA-5, le support CHS était obligatoire jusqu'à 16 514 064 secteurs et facultatif pour les disques plus grands. La limite ATA-5 correspond à CHS 16383 16 63 ou à des capacités de disque équivalentes (16514064=16383×16×63=1032×254×63), et nécessite 24=14+4+6 bits (16383+1=214).


def chs(lba,C=1024,H=255,S=63) :
  """
  lba' adresse linéairement le secteur, en indexant à partir de zéro.
  'C', 'H', 'S' spécifient la géométrie - fixe pour un disque donné :
     1 <= C <= 1024 (10 bits)
     1 <= H <= 255 (8 bits) et non 256 à cause de la bizarrerie du WD1010
     1 <= S <= 63 (6 Bits) et non 64 à cause de la bizarrerie du WD1010
   Renvoie l'adresse sous forme de tuple c,h,s :
     0 <= c <= 1023 (10 bits) modulo C
     0 <= h <= 255 (8 bits) modulo H
     1 <= s <= 63 (6 Bits) et non 64 à cause de la bizarrerie du WD1010
  """
  si C<1 ou H<1 ou S<1 ou C>1024 ou H>255 ou S>63 :
    raise ValueError, \N
      "Géométrie (C,H,S) non valide : ({},{},{})". \
        format(C,H,S)
  t,s = divmod(lba,S) ; s+=1 # pistes, décalage de secteur
  c,h = divmod(t,H)
  if c>=C : raise ValueError, \
    "Valeur lba non adressable : {} pour une géométrie de ({},{},{})". \
      format(lba,C,H,S)
  retourne (c,h,s)

def lba(c,h,s,C=1024,H=255,S=63) :
  """
  C', 'H', 'S' spécifient la géométrie comme pour la fonction 'chs'.
  c', 'h', 's' adresse un secteur dans cette géométrie.
  """
  si C<1 ou H<1 ou S<1 ou C>1024 ou H>255 ou S>63 :
    raise ValueError, \N
      "Géométrie (C,H,S) non valide : ({},{},{})". \
         format(C,H,S)
  si c<0 ou h<0 ou s<1 ou c>=C ou h>=H ou s>S :
    raise ValueError, \
      "Valeur (c,h,s) non adressable : ({},{},{}) pour une géométrie ({},{},{})". \
         format(c,h,s,C,H,S)
  retourne (c*H+h)*S+(s-1)


Adressage de blocs logiques :

Formule : A = (c ⋅ Ntêtes + h) ⋅ Nsecteurs + (s - 1)

    A - Adresse du bloc logique
    Nheads - Nombre de têtes sur un disque têtes par disque
    Nsecteurs - Nombre de secteurs sur une piste secteurs par piste
    c,h,s - sont les numéros de cylindre, de tête, de secteur 24 bits au total (10+8+6)