Description générale

Table de partition d'un disque dur : explications


Requis: Connaissance de la numérotation hexadécimale, binaire.
Le suffixe « h » ou préfixe « 0x » signifie que le nombre est exprimé en hexadécimal.
Souhaitable: Connaissance de l’assembleur 8086 (mode réel).


1. Description générale:

La table de partition ou Master Boot Record en anglais (MBR) désigne le premier secteur accessible d’un disque dur physique.
Elle est toujours située sur le cylindre N°0, secteur N°1 (la numérotation commence à 1 pour les secteurs) avec la tête de lecture N°0.
Notons que certains font la différence entre MBR et partition table, ce qui est effectivement justifié mais je ne souhaite pas entrer dans de tels détails sémantiques car il y a bien trop de choses à dire par ailleurs.

La façon d'adresser un disque dur est variable selon le niveau où l'on se place.
A la base, il s'agit de particules magnétisées représentant des 0 ou des 1.

La succession de ces 0 et 1 forment les données binaires que l'on connaît mais ce n'est pas aussi simple que 0=0 et 1=1 (cf. encodages RLL et consorts).

Lors du formatage de bas niveau ces valeurs binaires sont découpées en zones de 512 octets (4096 bits) entre lesquelles se trouvent des bits permettant le contrôle de la validité des données de chacune de ces zones (CRC: redondance cyclique). Ces zones sont appelées "secteurs".

Le formatage de haut niveau implante un système de fichiers dont l'une des caractéristiques est de découper le disque dur en lots de secteurs appelés unités d'allocation ("clusters").

L’accès à un disque dur au niveau du BIOS se fait non pas en terme de fichiers ni même en numéro de secteurs (sauf avec certaines extensions du BIOS) mais en précisant l’endroit où la zone visée (en fait le secteur de 512 octets) doit être lue ou écrite.

Il convient de désigner sur quelle zone (appelée également secteur) de quel cylindre et avec quelle tête de lecture l’opération doit être effectuée. Cet accès est donc de type « géométrique » puisque l’on fait explicitement référence à une zone physique du disque dur (bien qu'en fait cela ne reflète pas la réalité de l'emplacement du secteur en question sur le disque dur).

Image
Total = 512 octets soit un secteur entier

Une table de partition n’est donc pas qu’une table.
Elle contient, outre la table (descripteurs de partitions), un programme qui est exécuté à chaque démarrage de l’ordinateur (programme de démarrage) et une signature spéciale (marque de secteur exécutable) dont nous verrons l’utilité juste ci-dessous.

2. Démarrage d’un ordinateur compatible PC:

Il n’est pas question ici de décrire en détail le démarrage d’un PC mais simplement de donner les éléments qui concernent la table de partition.

La partie intéressante se situe dans la manière dont le BIOS sait que le premier secteur d’un disque donné est exécutable ou pas, c'est-à-dire s’il contient un programme en langage machine prévu à cet effet.

Image

En fait, le BIOS ne peut pas en être sûr mais si il trouve la signature caractéristique d’un secteur exécutable alors il suppose qu’il l’est. Cette signature appelée « marque de secteur exécutable » est constituée de deux octets qui terminent le secteur en question. Ces octets doivent être 55 AA (hexadécimal). Il s’agit bien évidemment d’une convention que tous les BIOS et tous les systèmes d’exploitation respectent.

Cette marque est quelquefois appelée également « repère AA55 ».
Ensuite, le contrôle est transféré à ce programme et c’est lui qui est chargé de trouver la partition active et ensuite de transférer le contrôle au secteur de démarrage (secteur de boot) correspondant à la partition en question. Mais nous verrons cela dans le paragraphe 4.

Descripteurs de partition (1)

3. Descripteurs de partition:

Il y a un total de quatre descripteurs dans une table de partition.
Ils comportent 16 octets et se conforment au format suivant :

Place relative
Type
Symbole
Description
0
Octet
Act
Indique si la partition est active : 80h si active (en général, mais il suffit que le bit 7 de l'octet soit à 1) sinon 0. Ce nombre désigne également le disque physique actif (cf. interruption BIOS correspondante)
1
Octet
Td
Tête de lecture du début de la partition
2
Mot
SCd
Secteur et cylindre du début de la partition
4
Octet
Ty
Type de partition
5
Octet
Tf
Tête de lecture de la fin de la partition
6
Mot
SCf
Secteur et cylindre de la fin de la partition
8
Double mot
DSd
Distance, en secteurs, entre la table de partition et le premier secteur de cette partition
12
Double mot
TS
Nombre total de secteurs dans cette partition

La première partition active est celle qui sera choisie pour poursuivre le démarrage.
Normalement, il n’y a qu’une seule partition active sur un disque dur physique donné.

3.1 Format du mot secteur + cylindre:

Le format détaillé du mot indiquant le secteur et le cylindre est le suivant :
Image
Attention :
Les processeurs Intel et compatibles inversent les octets lors de la lecture d’un mot. Par exemple, la lecture des octets consécutifs 5Eh, A3h conduisent au mot A35Eh.
Le format du numéro de cylindre est donc : Bit7 - Bit6 - Bit15 - Bit14 - Bit13 - Bit12 - Bit11 - Bit10 - Bit9 - Bit8. On remarquera au passage que cette notation sur trois octets (tête, cylindre et secteur) ne permet d’adresser qu’environ 8 Go avec une taille de secteur de 512 octets.

Les systèmes d’exploitation de type linux ou NT ont leurs propres pilotes qui autorisent l’accès à la totalité de tels disques sans passer par les routines du BIOS. Les systèmes d’exploitation un peu moins évolués sont obligés de passer par des extensions du BIOS pour adresser la plage du disque qui est au-delà de ces 8 Go (Windows 95 et 98).

Il en résulte que les données [tête, cylindre, secteur] peuvent être dépourvues de signification sur les disques de capacité supérieure à 8 Go.

Le partitionnement se basera donc plutôt sur le décompte des secteurs résidants dans les doubles mots de déplacements relatifs 8 (début de partition : DSd) et 12 (taille de partition : TS). Cette méthode, appelée pour la circonstance « LBA » (Logical Block Addressing) permet d’adresser, sans autres considérations que le format actuel de la table de partition, jusqu’à 2 To.

L'histoire du mode LBA est plus compliquée et plus longue qu'il n'y paraît (elle commence au moment où il fallait franchir la barrière de 504 Mo en capacité disque due aux limitations croisées de l'interface IDE et du BIOS).

Au niveau matériel, jusqu'il y a peu, le LBA utilisait uniquement 28 bits (limite 128 Go).
A présent, les nouveaux disques utilisent 48 bits (ce qui porte la limite théorique de capacité à 128 Po). Ce nombre devrait être porté à 64 bits (8 388 608 Po maximum).

Cette taille, au niveau des entrées correspondantes de la table de partition a été depuis le début de 32 bits (4 octets) , ce qui produit une limite à 2 To. Au niveau du BIOS, avec les dernières extensions LBA , 64 bits sont prévus également.

A terme, une solution devra être trouvée en ce qui concerne le format des entrées de la table de partition. Force est de constater qu'il est difficile d'évaluer la limite en capacité d'un système [disque + IDE + BIOS + OS ] donné !

Note : 1 Po = 1 024 To; 1 To = 1 024 Go

3.2 Types de partition:

Il est défini par l’octet de déplacement relatif 4 (Ty).
En voici les principaux types :

Valeur (hexa)
Type
0
Vide
5
Partition étendue MS, normale
6
Primaire MS, FAT16
7
NTFS (NT et XP)
0Bh
Primaire MS, FAT32, normale
0Ch
Primaire MS, FAT32, « adressée » LBA
0Eh
Primaire MS, FAT16, « adressée » LBA
0Fh
Partition étendue MS, « adressée » LBA
16h
Primaire MS, FAT16, cachée
1Bh
Primaire MS, FAT32, normale, cachée
1Ch
Primaire MS, FAT32, « adressée » LBA, cachée
1Eh
Primaire MS, FAT16, « adressée » LBA, cachée
1Fh
Partition étendue MS, « adressée » LBA, cachée
42h
Disque dynamique Windows 2000
82h
Linux, Mémoire virtuelle (swap)
83h
Linux, système de fichier
91h
Partition étendue MS, normale, effacée par FDISK
92h
Primaire MS, FAT16, effacée par FDISK
93h
Linux, système de fichier, cachée
97h
Primaire MS, FAT32, normale, effacée par FDISK
98h
Primaire MS, FAT32, « adressée » LBA, effacée par FDISK
9Ah
Primaire MS, FAT16, « adressée » LBA, effacée par FDISK
9Bh
Partition étendue MS, « adressée » LBA, effacée par FDISK
A5h
FreeBSD
A6h
OpenBSD
A9h
NetBSD
EBh
BeOS

Cette table n’est évidemment pas exhaustive.
On se reportera aux références citées dans le paragraphe 6 pour plus de précisions.

Descripteurs de partition (2)

3.3 Le cas de la partition étendue Microsoft:

Tous ceux qui ont utilisés un tant soit peu FDISK se sont un jour ou l’autre retrouvé face à une épineuse question.
Comment faire un disque de données en plus de la partition système '
Et bien, il n’y a guère le choix, il faut passer par la création d’une partition étendue puis créer des « lecteurs logiques ».

Une partition étendue est en fait une partition reprenant la structure d’un disque physique. C'est-à-dire que le premier secteur de ce type de partition est lui-même une sorte de table de partition comportant quatre descripteurs de partitions mais sans programme de démarrage.

La création de « disques logiques » revient alors à écrire dans cette table.
Ceci a l’avantage de pouvoir étendre considérablement le nombre de partitions possible sur un seul disque dur physique.

Notons que, de part l’absence de programme de démarrage dans la table de partition d’une partition étendue, il n’est normalement pas possible de démarrer sur un lecteur logique.

Cela est toutefois réalisable en plaçant un programme de démarrage spécial dans la table de partition principale. Ceci est en général assuré par un programme de type gestionnaire de démarrage (« boot manager »).

3.4 Exemples de partitions:

3.4.1 Disque dur 80 Go, XP:
Image
Ici, il n’y a qu’une seule partition qui occupe tout le disque.
Il s’agit de la partition active puisque Act = 80h. Elle est de type NTFS (Ty = 07).
Le premier secteur de cette partition se trouve aux coordonnées : tête = 1 (Td), cylindre = 0 (SCd) et secteur = 1 (SCd1).

Les paramètres Tf et SCf ont peu de signification car ce disque est plus grand que 8 Go.
On remarque que comme DSd = 0000003Fh (soit 63), le secteur de début de cette partition (secteur de démarrage ou « boot ») n’est pas immédiatement après la table de partition. Il y a donc un espace inoccupé de (62 x 512) octets = 31 Ko.

Cet espace fait la joie des gestionnaires de démarrage et accessoirement de certains virus qui logent une partie de leurs codes ici. La taille totale de la partition est de 098A40ECh secteurs en hexadécimal soit 76,32 Go.

Remarque: Horreur ! Mon disque est un 80 Go et je n'en dispose en fait que de 76 et quelques... Examinons le disque.

Dessus, il est écrit : "LBA: 160086528". Un simple calcul donne 160 086 528 x 512 (taille d'un secteur) = 81 964 302 336 octets soit environ 76,3 Go.

Ouf ! Le matériel et XP sont donc hors de cause. Alors pourquoi a t'on appelé 80 Go (c'est également marqué sur le disque dur) quelque chose qui ne dispose pas de cette capacité '
Difficile à dire... Question marketing ' Sûrement.

Il se peut également que les 3,7 Go manquant soient en réserve pour combler d'éventuels secteurs défectueux (ce genre d'opération est réalisée par le formatage de bas niveau). Il se peut aussi que, comme pour beaucoup d'articles que j'ai eu l'occasion de lire, on oublie de façon plus ou moins consciente que la correspondance entre unités de capacité mémoire comme le Go et le Mo n'est pas 1000 mais 1024 (1 Go = 1 024 Mo).

3.4.2 Disque dur 6 Go, Windows 98:
Image
Ici, la partition active est de type FAT32 sans LBA (Ty = 0Bh).
La partition commence au même endroit que celle de XP dans l’exemple précédent.
Même espace entre la table de partition et le secteur de « boot » de Windows 98, soit 31 Ko.

Cette partition fini aux coordonnées : Tête = FEh (254 en décimal), cylindre = 30Eh (782 en décimal), secteur = 3Fh (63 en décimal).
En appliquant la formule (têtes + 1) x (cylindres + 1) x Secteurs x Taille secteur (512 octets), on retombe bien sur environ 6 Go.

La taille totale de cette partition (indiquée en secteurs par TS) est de 00BFF010h secteurs soit environ 6 Go.

Le programme de démarrage de la table

4. Le programme de démarrage de la table de partition:

Chaque système d’exploitation place son propre programme dans la table de partition.
A quelques variations importantes, ils font tous sensiblement la même chose.

Rappelons que le BIOS va tout d’abord le charger à l’adresse mémoire fixe 0000:07C00h puis vérifier si la marque de secteur exécutable est présente (AA55h) et dans l’affirmative va effectuer un saut sur 0000:07C00h afin de conférer le contrôle à ce programme.

Lors du démarrage depuis le BIOS, le PC compatible est placé en mode réel.
Ce mode de fonctionnement du processeur utilise un système d’adressage différent de celui de Windows qui s'exécute, pour sa part, en mode protégé.

Dans le mode réel on utilise non pas un registre 32 bits pour pointer sur une adresse en mémoire mais deux registres 16 bits pour désigner une adresse de 20 bits.

On appelle ces registres déplacement ou offset d’une part et segment d’autre part. L’adresse effective se calcule avec segment x 16 + déplacement.

Ce système d’adressage permet donc théoriquement d’accéder à 1 Mo de mémoire maximum (en fait il y a quelques moyens pour augmenter ce « maximum »).
C’est le mode antique de fonctionnement du Dos.

Voici les actions réalisées par le programme de démarrage d’une table de partition XP :

Image

Le programme principal lui-même


Image
Image
Image

Sous-programme de contrôle

Sous-programme de contrôle de la partition active et de chargement du secteur de boot

Il prend en entrée l’adresse pointant sur le descripteur de la partition active à examiner dans  ss:bp.
Il charge le secteur si possible que ce soit avec ou sans le recours au LBA.
En cas d’erreur le drapeau (flag) c (carry) est mis à 1.

Image

Désassemblage du sous-programme

Image
Image
Image
Image

Suite et fin.

Restent les données


Image

5. Conclusion:

Voilà c’est terminé.
J'espère que la table de partition vous paraît moins obscure à présent.
Par ailleurs, le premier fragment du processus de démarrage de Windows XP après le BIOS est totalement expliqué.

Tous les autres OS utilisent en principe des modes opératoires pas très éloignés de celui-ci, car ils sont tenus de respecter un minimum les conventions du BIOS afin de pouvoir être utilisés en « multiboot ».

Je dis en principe car la table de partition d’un système Linux équipé de LILO est assez étrange…
J’en retiens que contrairement à certaines rumeurs, XP semble tout à fait capable de démarrer quelle que soit la distance entre la table de partition et la partition active (même au-delà de 8 Go) pourvu que le BIOS dispose des extensions idoines.


6. Références:

6.1 Bibliographie:

Informations générales MBR : http://users.win.be/W0005997/GI/mbr.html
Types de partitions :  http://www.win.tue.nl/~aeb/partitions/partition_types-1.html
Interruptions du 8086 : http://www.ctyme.com/intr/int.htmX
Assembleur 8086  Aide mémoire de l’assembleur, Eduard Pandele, édition Marabout (mais je le déconseille car il est vraiment trop succinct).


6.2 Outils utilisés pour écrire cet article:

Tous les programmes utilisés sont libres (« freeware »).
Extraction de la table de partition : DDPART.com (Dos réel, programme fait maison)
Editeur hexdécimal : XVI32 (Windows, Christian Maas, http://www.chmaas.handshake.de )
Désassembleur 16/32 bits : NASM (console Windows, SourceForge (LGPL), http://sourceforge.net/projects/nasm ).