LBA - Logical Block Address
Présentation
Le mode CHS permet d'adresser un secteur du disque en indiquant son numéro de secteur, le numéro du cylindre où il se trouve ainsi que le numéro de la tête. Malheureusement, ce mode ne permet d'adresser que 1024 cylindres, 63 secteurs et 256 têtes soit 1024*63*256*512=8455716864 octets soit un peu moins de 8 Go, ce qui est peu de nos jours (quoique certains disques supportent des adresses CHS supérieures à cette limite).
Au contraire, le mode LBA utilise une adresse logique sur 28 bits : le 1e secteur a l'adresse 0, le 63e l'adresse 62, le 1e secteur du 2e cylindre l'adresse 63 (s’il y a 63 secteurs par cylindres) et ainsi de suite. Le mode LBA permet donc d'adresser 2^28*512=137438953472 octets soit 128 Go.
Utilisation, différences par rapport au mode CHS
L'utilisation du mode LBA n'est pas beaucoup plus compliquée que le mode CHS, les différences peuvent être résumées de la manière suivante :
| Registre | Mode CHS | Mode LBA |
|---|
| Registre de lecteur et tête, bit 6 | 0 | 1 |
| Numéro de secteur | Numéro du secteur | Bits 0 à 7 de l'adresse LBA |
| Numéro de cylindre, octet de poids faible | Numéro de cylindre, octet de poids faible | Bits 8 à 15 de l'adresse LBA |
| Numéro de cylindre, octet de poids fort | Numéro de cylindre, octet de poids fort | Bits 16 à 23 de l'adresse LBA |
| Registre de lecteur et tête, bits 0 à 3 | Numéro de tête | Bits 24 à 27 de l'adresse LBA |
Pour le reste, tout est identique.
Conversion d'une adresse CHS en adresse LBA et inversement
adresse logique = (numero de secteur - 1) + (numero de tête * nombre de secteurs par cylindre) + (numero de cylindre * nombre de secteurs par cylindre * nombre de têtes)
secteur CHS = entier(1 + reste de (adresse logique / nombre de secteurs par pistes))
tête CHS = entier(reste de ((adresse logique / nombre de secteurs par pistes) / nombre de têtes))
piste CHS = entier(adresse logique / (nombre de secteurs par cylindre * nombre de faces))
Considérons lba l'adresse logique, c le cylindre, h la tête, s le secteur, H le nombre de têtes et S le nombre de secteurs par cylindre, voici les mêmes formules dans une syntaxe de style C (types entiers) :
lba = (s - 1) + (h * S) + (c * S * H);
s = 1 + (lba% S);
h = (lba / S)% H;
c = lba / (S * H);