Verder Terug Inhoud

4. Disk Toegang

Om iets van disk te kunnen lezen of naar disk te kunnen schrijven, moeten we een positie op de disk aangeven, door bijvoorbeeld het geven van een sector- of bloknummer. Als de disk een SCSI-disk is, dan gaat dit sectornummer direct in de SCSI-opdracht en wordt door de disk begrepen. Als de disk een IDE-disk is, die van LBA gebruik maakt, dan geldt precies hetzelfde. Maar als het een oude, RLL of MFM of IDE-disk van voor de LBA-tijd is, dan verwacht de diskhardware een drietal (cylinder, head, sector) om de gewenste plek op de disk aan te duiden.

De overeenkomst tussen de lineaire nummering en deze 3D notatie is als volgt: voor een disk met C cylinders, H heads en S sectoren/spoor is de positie (c,h,s) in 3D of CHS notatie hetzelfde als positie c*H*S + h*S + (s-1) in lineaire of LBA notatie. (De min één is omdat sectoren traditioneel worden geteld vanaf 1, niet 0, in deze 3D notatie.)

Dus om een zeer oude niet-SCSI disk te benaderen hebben we z'n geometrie nodig, dat wil zeggen, de waarden van C, H en S.

4.1 BIOS Disk Toegang en de 1024 cylinder limiet

Linux maakt geen gebruik van de BIOS, maar een aantal andere systemen doen dit wel. De BIOS die dateert van voor de LBA tijd, biedt disk I/O routines die (c,h,s) als invoer hebben. (Preciezer: In AH staat de functie die moet worden uitgevoerd, CH bestaat uit de lage 8 bits van het cylindernummer, in CL de bits 7-6 staan de hoge twee bits van het cylindernummer en in bits 5-0 het sectornummer, DH is het head nummer, en DL is het drive nummer (80h of 81h). Hiermee wordt een deel van de lay-out van de partitietabel verduidelijkt.)

Op deze manier hebben we CHS in drie bytes gecodeerd, met 10 bits voor het cylindernummer, 8 bits voor het head nummer, en 6 bits voor het spoorsectornummer (genummerd 1-63). Hieruit volgt dat cylindernummers voor kunnen komen in het bereik van 0 tot 1023 en dat er niet meer dan 1024 cylinders BIOS-adresseerbaar zijn.

De DOS en Windows software wijzigde niet toen IDE disks met LBA ondersteuning werden geïntroduceerd, dus DOS en Windows hadden nog steeds een diskgeometrie nodig, zelfs toen dit niet langer nodig was voor de feitelijke disk I/O, maar alleen maar om met de BIOS te kunnen communiceren. Dit betekent weer dat Linux de geometrie nodig heeft in die situaties, zelfs met een moderne disk, waar communicatie met de BIOS of met andere besturingssystemen is vereist.

Deze kwestie duurde tot ongeveer 4 jaar geleden en toen verschenen er disks op de markt die niet met de INT13 functies konden worden geadresseerd (omdat de 10+8+6=24 bits voor (c,h,s) niet meer dan 8.5 GB kunnen adresseren) en er werd een nieuwe BIOS interface ontworpen: de zogenoemde Extended INT13 functies, waarin DS:SI verwijst naar een 16-byte Disk Adres Packet dat een 8-byte beginnnend absoluut bloknummer bevat.

De Microsoft wereld beweegt zich heel langzaam in de richting van het gebruiken van deze Extended INT13 functies. Waarschijnlijk zal over een paar jaar geen modern systeem op moderne hardware het concept `diskgeometrie' nog nodig hebben.

4.2 Historie van BIOS en IDE limieten

ATA Specificatie (voor IDE disks) - de 137 GB limiet

Voor een maximale totale capaciteit van 267386880 sectoren (van elk 512 bytes), dat wil zeggen 136902082560 bytes (137 GB), ten hoogste 65536 cylinders (genummerd 0-65535), 16 heads (genummerd 0-15), 255 sectoren/spoor (genummerd 1-255). Dit is net nog geen probleem (in 1999) maar dat zal het over een aantal jaren wel zijn.

BIOS Int 13 - de 8.5 GB limiet

Voor een maximum totale capaciteit van 8455716864 bytes (8.5 GB) op z'n hoogst 1024 cylinders (genummerd 0-1023), 256 heads (genummerd 0-255), 63 sectoren/spoor (genummerd 1-63). Dit is tegenwoordig een serieuze beperking. Het betekent dat DOS de huidige grote disks niet kan gebruiken.

De 528 MB limiet

Als dezelfde waarden voor c,h,s voor de BIOS Int 13 call en voor de IDE disk I/O worden gebruikt, dan combineren beiden beperkingen, en kan men maximaal 1024 cylinders, 16 heads, 63 sectoren/spoor gebruiken, voor een maximale capaciteit van 528482304 bytes (528 MB), de schandelijke 504 MiB limiet voor DOS met een oude BIOS. Dit begon een probleem te worden rond 1993, en mensen namen hun toevlucht tot allerlei soorten bedotterij, zowel in hardware (LBA) als in firmware (BIOS vertalingen), en in software (diskmanagers). Het concept `vertaling' werd uitgevonden (1994): een BIOS zou een geometrie kunnen gebruiken bij het communiceren met de drive, en een andere nepgeometrie bij het communiceren met DOS, en tussen die twee vertalen.

De 2.1 GB limiet (April 1996)

Een aantal oudere BIOSsen wijzen slechts 12 bits toe aan het veld in CMOS RAM waarin het aantal cylinders wordt aangegeven. De consequentie hiervan is, dat dit aantal maximaal 4095 kan zijn, en er slechts 4095*16*63*512=2113413120 bytes toegankelijk zijn. Als je een grotere disk hebt, heeft dit als effect dat het systeem tijdens het booten blijft hangen. Dit zorgde ervoor dat disks met een geometrie van 4092/16/63 nogal populair waren. En tegenwoordig komen er nog steeds vele grote diskdrives met een jumper om ze in te stellen als 4092/16/63. Zie ook over2gb.htm. Andere BIOSsen zouden niet blijven hangen, maar detecteren slechts een veel kleinere disk, zoals 429 MB in plaats van 2.5 GB.

De 3.2 GB limiet

In de Phoenix 4.03 en 4.04 BIOS firmware zat een bug die veroorzaakte dat het systeem vastliep in de CMOS setup bij drives met een capaciteit groter dan 3277 MB. Zie over3gb.htm.

De 4.2 GB limiet (Feb 1997)

Eenvoudige BIOS vertaling (ECHS=Extended CHS, soms `Large disk ondersteuning' of gewoon `Large' genoemd) werkt door het aantal heads dat aan DOS wordt getoond herhalend te verdubbelen en het aantal cylinders te halveren totdat het aantal cylinders maximaal 1024 is. Nu kunnen DOS en Windows 95 niet met 256 heads omgaan, en in het algemene geval dat de disk 16 heads rapporteert, betekent dit dat dit eenvoudige mechanisme alleen werkt tot 8192*16*63*512=4227858432 bytes (met een nep geometrie van 1024 cylinders, 128 heads, 63 sectoren/spoor). Merk op dat ECHS het aantal sectoren per spoor niet wijzigt, dus als dit niet gelijk is aan 63, zal de limiet lager zijn. Zie over4gb.htm.

De 7.9 GB limit

Iets slimmere BIOSsen voorkomen het voorgaande probleem door eerst het aantal heads aan te passen tot 15 (`gereviseerde ECHS'), zodat een nepgeometrie met 240 heads kan worden verkregen, goed voor 1024 *240*63*512=7927234560 bytes.

De 8.4 GB limit

Als laatste, als de BIOS alles doet om deze vertaling tot een succes te maken, en 255 heads en 63 sectoren/spoor gebruikt (`geassisteerde LBA' of gewoon `LBA') kan het 1024*255*63*512=8422686720 bytes bereiken, iets minder dan de eerdere 8.5 GB limiet omdat de geometries met 256 heads moeten worden vermeden. (Deze vertaling zal voor het aantal heads de eerste waarde H in de reeks 16, 32, 64, 128, 255 gebruiken waarvan de totale diskcapaciteit past in 1024*H*63*512, en berekent het aantal cylinders C als totale capaciteit gedeeld door (H*63*512).)

De 33.8 GB limiet (augustus 1999)

De volgende horde komt met een grootte van meer dan 33.8 GB. Het probleem is dat met de standaard 16 heads en 63 sectors/track dit overeenkomt met een aantal cylinders van meer dan 65535, wat niet in een short past. De meeste tegenwoordig bestaande BIOSsen kunnen met dergelijke disks niet omgaan. (Zie, b.v., Asus upgrades voor nieuwe flash images die wel werken). Linux kernels ouder dan 2.2.14 / 2.3.21 hebben een patch nodig. Zie IDE problemen met 34+ GB disks hieronder.

Zie, Breaking the Barriers, en met meer details, IDE Hard Drive Capacity Barriers voor een andere bespreking over dit onderwerp.

Van harddrives van meer dan 8.4 GB wordt verondersteld dat ze hun geometrie als 16383/16/63 rapporteren. Dit betekent in feite dat de `geometrie' verouderd is, en de totale diskgrootte niet langer vanuit de geometrie berekend kan worden.


Verder Terug Inhoud