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í.
offset | popis |
---|---|
00h-002h | Instrukce: (CLI; JMP 03Eh) |
003h-00Ah | Jmé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-00Ch | Počet bytů na sektor - skoro vždy 512 |
00Dh | Sectory/Cluster |
00Eh-00Fh | Počet reservovaných sektorů |
010h | Poč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-012h | Počet kořenových adresářů (Number of Root Entries) |
013h-014h | Celkový počet sektorů |
015h | Popisovač média |
016h-017h | Sectory/FAT (velikost FAT v sektorech = místo na disku, které FAT zabírá) |
018h-019h | Sectory/Track (FD) or Sectory/Cylinder (HD) |
01Ah-01Bh | Počet hlav |
01Ch-01Fh | Počet skrytých sektorů |
020h-023h | Rozšíř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"). |
024h | Kód pro bootstrapdrive (???) |
025h | Reservováno |
026h | Extended bootsignature (= 029h), Používáno k indikaci jestli jsou rozšířené informace správné, resp. platné. |
027h-02Ah | 32-bitové sériové číslo |
02Bh-035h | Pojmenování disku, zde je 11 znaků dlouhý textový řetězec. Prázdné místo je vyplněno mezerami (kód 32, 20h) |
036h-03Dh | Identifikátor varianty systému souborů "FAT12" pro filesystem FAT12 a "FAT16" pro FAT16. |
03Eh-1FDh | Bootstrapprogram - zřejmě hlavní kód zavaděče |
1FEh-1FFh | Bootsignature (= 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ářů.
offset | popis |
---|---|
00h-07h | jmé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-0Ah | přípona (bat, txt, sys, doc a další) |
0Bh | atributy souboru |
0Ch-15h | reservováno |
16h-17h | Čas vytvoření, nebo poslední změny souboru |
18h-19h | Datum vytvoření, nebo poslední změny souboru |
1Ah-1Bh | první cluster obsazený souborem = vstupní bod do FAT |
1Ch-1Fh | velikost 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.
bity | Popis atributů |
---|---|
0 | Read-only = pouze ke čtení |
1 | Hidden = skrytý soubor |
2 | System file = systémový soubor |
3 | Disk 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. |
4 | Directory = adresář |
5 | Archive bit = zálohovací program bude tento soubor zálohovat. Standardně je každý soubor vytvářen s příznakem Archive=1. |
6-7 | Reservováno |
Uložení data a času
bity | popis |
---|---|
0-4 | Sekundy / 2 (0-29) |
5-10 | Minuty (0-59) |
11-15 | Hodiny (0-23) |
16-20 | Datum (1-31) |
21-24 | Měsíc (1-12) |
25-31 | Rok (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
offset | bytů | typ | popis |
---|---|---|---|
0 (00h) | 1 | byte | pořadové číslo v sekvenci tvořící dlouhé jméno |
1 (01h) | 10 | string(10) | prvních 5 znaků této části jména souboru |
11 (0Bh) | 1 | byte | atributy |
12 (0Ch) | 1 | byte | vždy 0 |
13 (0Dh) | 1 | byte | kontrolní součet pro jméno ve formátu 8.3 |
14 (0Eh) | 12 | string(12) | dalších 6 znaků této části jména souboru |
26 (1Ah) | 2 | word | počá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) | 12 | string(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
FAT12 | FAT16 | popis |
---|---|---|
000h | 0000h | nepoužitý cluster |
001h-FEFh | 0001h-FFEFh | pozice následujícího clusteru v "alokačním řetězu" |
FF0h-FF6h | FFF0h-FFF6h | reservované clustery |
FF7h | FFF7h | cluster obsahující vadné sektory |
FF8h-FFFh | FFF8h-FFFFh | konec "alokačního řetězu" |
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)
offset | popis |
---|---|
0000 | Master Boot Record |
01BE | paremetry 1. oddílu |
01CE | paremetry 2. oddílu |
01DE | paremetry 3. oddílu |
01EE | paremetry 4. oddílu |
01FE | signatura (055 0AA) |
offset | bitů | popis | příklad |
---|---|---|---|
00h | 8 | Bootable - 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 |
01h | 8 | Začátek oddílu - Strana resp. Hlava (Side, Head) | 01h = typická hodnota pro první oddíl |
02h, 03h | 16 | Začátek oddílu - Sektor/Cylinder (track) | 0001h = typická hodnota pro první oddíl |
04h | 8 | Systé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 |
05h | 8 | Konec oddílu - Strana resp.Hlava (Side, Head) | 3Fh (63) |
06h, 07h | 16 | Konec oddílu - Sektor/Cylinder (track) | 3Fh (63), B6h (182) |
08h | 32 | Relative 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) | 32 | Number 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ů