Filesystém FAT12/FAT16

Tuto stránku jsem stáhnul z webu, přeložil a doplnil. Původního autora bohužel nemůžu uvést, protože následující tabulky v nezměněné podobě sdílí na svých stránkách autorů hned několik, nejsem ochoten zjišťovat kdo to jen okopíroval.

BOOT STRAP RECORD

Podle terminologie, která se běžně vyskytuje bych psal jen BootRecord, ale takto se to asi má jmenovat správně.

Tuto část se BIOS PC pokouší spouštět po nastartování systému pokud je ve správné partition. Kód uložený v BOOT recordu má pak za následek načtení operačního systému (Unix ...), diskového ovladače (DOS => Windows jsou ovladač disku s grafickým rozhraním) a nebo pouhé vypsání hlášky, že něco takového na disku není.

offsetpopis
00h-002hInstrukce: (CLI; JMP 03Eh)
003h-00AhJméno DOSu a jeho verze, standardně je zde 8 znaků dlouhý textový řetězec a prázdné místo je vyplněno mezerami (kód 32, 20h).
00Bh-00ChPočet bytů na sektor - skoro vždy 512
00DhSectory/Cluster
00Eh-00FhPočet reservovaných sektorů
010hPočet FAT
FAT 12 i FAT 16 podporují pouze 2 FAT : 1. hlavní FAT a 2. jako záložní. Záložní FAT je a musí být úplnou kopií hlavní FAT. Používá se prakticky výhradně při rekonstrukci poškozené hlavní FAT.
011h-012hPočet kořenových adresářů (Number of Root Entries)
013h-014hCelkový počet sektorů
015hPopisovač média
016h-017hSectory/FAT (velikost FAT v sektorech = místo na disku, které FAT zabírá)
018h-019hSectory/Track (FD) or Sectory/Cylinder (HD)
01Ah-01BhPočet hlav
01Ch-01FhPočet skrytých sektorů
020h-023hRozšířený celkový počet sektorů, pokud je "Celkový počet sektorů" v bytech 013h-014h nulový pak je tento parametr správný. Tento parametr je obvykle používán výhradně pro harddisky. Použití na disketě je možné, ale zbytečné, protože počet sektorů obvykle nepřekročí 3000 (2880 sektorů je na standardně formátované disketě 3 1/2").
024hKód pro bootstrapdrive (???)
025hReservováno
026hExtended bootsignature (= 029h), Používáno k indikaci jestli jsou rozšířené informace správné, resp. platné.
027h-02Ah32-bitové sériové číslo
02Bh-035hPojmenování disku, zde je 11 znaků dlouhý textový řetězec. Prázdné místo je vyplněno mezerami (kód 32, 20h)
036h-03DhIdentifikátor varianty systému souborů "FAT12" pro filesystem FAT12 a "FAT16" pro FAT16.
03Eh-1FDhBootstrapprogram - zřejmě hlavní kód zavaděče
1FEh-1FFhBootsignature (= AA55h or db 55h, AAh), hodně lidí se mylně domnívá, že toto indikuje DOSovský BootRecord, ale to není pravda. Tato značka je používána pokud pmaster bootstraprecord??? rozděleného harddisku zjišťuje jestli je vybraný bootstraprecord vybraného oddílu správný. ( Many people mistakenly believe that this indicates a DOS bootstraprecord, but that is not true. This bootsiganture is used when the pmaster bootstraprecord of a partitioned harddisk has to check that the selected partition bootstraprecord is valid.)

Položka adresáře

Každý soubor, nebo adresář má právě jednu takovou položku v některém z (pod)adresářů.

offsetpopis
00h-07hjméno souboru - neobsahuje tečku, prvních 8 znaků je jméno a další 3 přípona. Tečku doplňuje operační systém.
08h-0Ahpřípona (bat, txt, sys, doc a další)
0Bhatributy souboru
0Ch-15hreservováno
16h-17hČas vytvoření, nebo poslední změny souboru
18h-19hDatum vytvoření, nebo poslední změny souboru
1Ah-1Bhprvní cluster obsazený souborem = vstupní bod do FAT
1Ch-1Fhvelikost souboru v bytech

Atributy souboru, nebo adresáře

Má-li atribut hodnotu TRUE (log. 1) je aktivní, toto platí pro všechny atributy v násl. tabulce.

bityPopis atributů
0Read-only = pouze ke čtení
1Hidden = skrytý soubor
2System file = systémový soubor
3Disk label = jméno disku, toto jméno je stejné jako jméno uložené v BootRecordu. Není mi zcela jasné proč je uloženo v adresáři podruhé. Možná, kvůli tomu, aby program procházející diskem nemusel BootRecord načítat dostane-li se do kořenového adresáře.
4Directory = adresář
5Archive bit = zálohovací program bude tento soubor zálohovat. Standardně je každý soubor vytvářen s příznakem Archive=1.
6-7Reservováno

Uložení data a času

bitypopis
0-4Sekundy / 2 (0-29)
5-10Minuty (0-59)
11-15Hodiny (0-23)
16-20Datum (1-31)
21-24Měsíc (1-12)
25-31Rok (1980 + Rok) - Toto bude pracovat do roku 2109, potom, bude-li ještě tento filesystém používán, nastane další problém s určením roku.

Rozšíření položky pro dlouhá jména souborů VFAT

offsetbytůtyppopis
0 (00h)1bytepořadové číslo v sekvenci tvořící dlouhé jméno
1 (01h)10string(10)prvních 5 znaků této části jména souboru
11 (0Bh)1byteatributy
12 (0Ch)1bytevždy 0
13 (0Dh)1bytekontrolní součet pro jméno ve formátu 8.3
14 (0Eh)12string(12)dalších 6 znaků této části jména souboru
26 (1Ah)2wordpočáteční číslo clusteru jmen, tj. počátek řetězu adresářových položek uložený v normální adresářové položce, které dlouhé jméno obsazuje, 0 u následujících částí (položky, které nejsou první a neobsahují 8.3 alias)
28 (1Ch)12string(12)další 2 znaky této části jména souboru

Položky, které tvoří dlouhé jméno mají atributy nastavené implicitně na Readonly, Hidden, System a Volume, takže je starší verze DOSu nevidí. Pokud dojde ke smazání standardní části jména - té první položky s názvem pouze v 8.3 formátu dojde k nekonzistenci, kterou umí odstranit pouze programy pracující s VFAT, např. Windowsácký Scandisk. Programy, které kontrolují strukturu FAT podle zvyklostí DOSu naopak tyto rozšiřující položky častokrát zničí.

FAT a její fungování

Toto se netýká jen FAT 12 a FAT 16, ale princip je obecně stejný pro jakýkoliv systém používají FAT (alokační tabulku souborů). Nejdříve je nutné rozdělit disk na určité celky, kterým se říká clustery. V každém clusteru je několik sektorů (nejméně jeden, nejvýše 128 z toho plyne velikost clusteru 65536 bytů). Tyto clustery mají na disku své fyzické umístění, toho využívá FAT, která je vlastně pouze jakousi mapou disku a každá její položka umístěním odpovídá umístění příslušného clusteru = alokační jednotky.

Ukládáte-li na disk soubor provádí se zhruba následující kroky. Nejdříve (předpokládám, že je na disku dost volného místa) je nalezen první volný sektor od začátku disku. Číslo položky ve FAT odpovídající tomuto sektoru je zapsáno do adresáře a říká se mu vstupní bod do FAT. Část souboru se zapíše do tohoto nalezeného clusteru a pokud se tam nevešel celý je nalezen další volný cluster. Číslo odpovídající položky ve FAT je tentokrát zapsáno ne do adresáře, ale do té minulé položky FAT ... a tak dále ... položky jsou postupně obsazovány až nastane situace, že byl zapsán i poslední byte souboru. V tom případě se do položky FAT odpovídající poslednímu obsazenému clusteru zapíše číslo "konec alokačního řetězu" - viz. tabulka.

Tímto postupem vznikne sada položek ve FAT a vstupní bod v adresáři, které na sebe vzájemně odkazují jako jednosměrný zřetězený seznam začínající v adresáři a končící právě tou položkou posledního obsazeného clusteru. Zvláštní situace nastává v případě, že soubor má nulovou délku. Potom není obsazena žádná položka FAT, pouze vstupní bod v adresáři obsahuje kód "konec alokačního řetězu".

Zvláštní kódy vyskytující se v položkách FAT

FAT12FAT16popis
000h0000hnepoužitý cluster
001h-FEFh0001h-FFEFhpozice následujícího clusteru v "alokačním řetězu"
FF0h-FF6hFFF0h-FFF6hreservované clustery
FF7hFFF7hcluster obsahující vadné sektory
FF8h-FFFhFFF8h-FFFFhkonec "alokačního řetězu"
schéma uložení položek FAT12

Obrázek: způsob zápisu 2 položek FAT12 do 3 bytů, je to prakticky stejné jako u MDOSu (D40).

Partition table - tabulka rozdělení disku na oddíly

Nakonec bych rád doplnil ještě informace o tvoření oddílů na harddisku. Následující informace jsem původně zjistil postupným testováním a později se mi podařilo získat podrobný popis, díky kterému jsem odstranil některé nesrovnalosti. Takže informace zde uvedené by teď měly být zcela správné.

Struktura sektoru číslo 1 PC disku (C/H/S = 0/0/1)

offsetpopis
0000Master Boot Record
01BEparemetry 1. oddílu
01CEparemetry 2. oddílu
01DEparemetry 3. oddílu
01EEparemetry 4. oddílu
01FEsignatura (055 0AA)
offsetbitůpopispříklad
00h8Bootable - informuje o tom, je-li je možno z tohoto oddílu spustit operační systém (tj. oddíl je aktivní).80h = z oddílu lze bootvat
00h = z oddílu bootovat nelze
01h8Začátek oddílu - Strana resp. Hlava (Side, Head)01h = typická hodnota pro první oddíl
02h, 03h16Začátek oddílu - Sektor/Cylinder (track)0001h = typická hodnota pro první oddíl
04h8Systém - druh operačního systému pod nímž je oddíl zformátován (a rozlišení jedná-li se o oddíl primární, nebo rozšířený)příklad viz. následující tabulka
05h8Konec oddílu - Strana resp.Hlava (Side, Head)3Fh (63)
06h, 07h16Konec oddílu - Sektor/Cylinder (track)3Fh (63), B6h (182)
08h32Relative Sectors = to je vlastně informace o umístění oddílu, tj. sektor od začátku disku na němž oddíl začíná.0000003Fh (63)
0Ch (12)32Number Of Sectors = počet sektorů, které oddíl zabírá na disku, toto číslo je vždy celočíselným násobkem počtu hlav a sektorů (tedy alespoň u těch disků, které jsem testoval).000B4201h (737'793)

Tabulka identifikací partition

Tato tabulka pochází z programu fdisk, který je součástí snad každé linuxové distribuce.

0  Prázdný prostor 1c  Skrytá Win95 FA 70  DiskSecure Mult bb  skrytý Boot Wiz
1  FAT12           1e  Skrytá Win95 FA 75  PC/IX           be  Solaris boot
2  XENIX root      24  NEC DOS         80  Starý Minix     c1  DRDOS/sec (FAT-
3  XENIX usr       39  Plan 9          81  Minix / starý L c4  DRDOS/sec (FAT-
4  FAT16 <32M      3c  PartitionMagic  82  Linux swap      c6  DRDOS/sec (FAT-
5  Rozšířený       40  Venix 80286     83  Linux           c7  Syrinx
6  FAT16           41  PPC PReP Boot   84  OS/2 skrytý C:  da  data mimo SS
7  HPFS/NTFS       42  SFS             85  Linux extended  db  CP/M / CTOS / .
8  AIX             4d  QNX4.x          86  NTFS svazek     de  Dell utilita
9  AIX startovací  4e  QNX4.x 2. část  87  NTFS svazek     df  BootIt
a  OS/2 Boot Manag 4f  QNX4.x 3. část  8e  Linux LVM       e1  DOS access
b  Win95 FAT32     50  OnTrack DM      93  Amoeba          e3  DOS R/O
c  Win95 FAT32 (LB 51  OnTrack DM6 Aux 94  Amoeba BBT      e4  SpeedStor
e  Win95 FAT16 (LB 52  CP/M            9f  BSD/OS          eb  BeOS ss
f  Win95 Ext'd (LB 53  OnTrack DM6 Aux a0  IBM Thinkpad hi ee  EFI GPT
10  OPUS            54  OnTrackDM6      a5  FreeBSD         ef  EFI (FAT-12/16/
11  Skrytá FAT12    55  EZ-Drive        a6  OpenBSD         f0  Linux/PA-RISC b
12  Compaq diagnost 56  Golden Bow      a7  NeXTSTEP        f1  SpeedStor
14  Skrytá FAT16 <3 5c  Priam Edisk     a8  Darwin UFS      f4  SpeedStor
16  Skrytá FAT16    61  SpeedStor       a9  NetBSD          f2  DOS sekundární
17  Skrytá HPFS/NTF 63  GNU HURD či Sys ab  Darwin boot     fd  Linux raid auto
18  AST SmartSleep  64  Novell Netware  b7  BSDI ss         fe  LANstep
1b  Skrytá Win95 FA 65  Novell Netware  b8  BSDI swap       ff  BBT

POZOR! Adresa C/H/S není kompletní, údaj o cylindru by měl být 16ti bitový, ale je jen v jednom bytu. Podle tabulky, kterou jsem stáhnul z nějaké ruské stránky se cylinder a sector ukládají do 16 bitů tak, že 6 bitů připadá na sector a zbývajících 10 bitů na cylinder. No, to by snad i fungovalo, rozhodně pro harddisky do 512 MB, ale pak už ne. A navíc, aby to nebylo tak jednoduché, tak třeba FDISK od Micro$oftu toto okázale ignoruje, stejně tak jako asi i zbytek DOSu.

Nakonec se ukázalo jako nejrozumnější používat údaje "Relative Sectors" a "Number Of Sectors". Z nich pak není problém vypočítat skutečnou C/H/S (nebo LBA) adresu na základě parametrů disku.

Informace o primárním oddílu jsou vždy v úplně prvním sektoru na disku (tj. C/H/S = 0/0/1). Za ním obvykle následuje oddíl rozšířený a v prvním sektoru, který je tímto rozšířeným oddílem vymezen pak jsou definovány jednotky logické a to prakticky stejným způsobem jako ve fyzicky prvním sektoru na disku Tj. jedna logická jednotka se chová jako primární a následující je rozšířená a v ní další atd. Takže vytvoříte-li partition tabulku pomocí FDISKu v DOSu pak budou v každém sektoru, který je jí obsazen, nejvýše dvě položky bez ohledu na počet logických jednotek.

Tak to je asi vše o partition tabulce. Pokud objevíte nějaké nesrovnalosti (velmi pravděpodobné), tak mi prosím napište.

Použitá literatura: Anglické texty z jiných WWW stránek. Některé informace jsem ověřoval a zjišťoval testováním.

Související odkazy

Opravené chyby a změny

  • 10.4.2000 - upravil jsem popis partition tabulky, snad už definitivně
  • 12.5.2004 - doplněna tabulka s rozšířením VFAT = dlouhá jména souborů

[ Zpět na hlavní stránku ]

Cygnusova stránka o ZX Spectru a kompatibilních počítačích byla napsána (přepsána) výhradně pomocí svobodného Open Source softwaru. V případě že naleznete chybu, nebo byste rádi cokoliv co se ZX Spectrem souvisí, neváhejte mi napsat na některý z mých emailů, nebo pracovně do zaměstnání. Stručně o mém webu se můžete dočíst zde.