File Allocation Table

File Allocation Table, skrátene FAT, je čiastočne patentovaný súborový systém, ktorý sa používal v prvých 16/32-bitových verziách operačného systému Microsoft Windows a v systéme MS-DOS. Existuje niekoľko verzií systému FAT, napríklad FAT12, FAT16 a FAT32. Systém FAT32 sa používal od Windows 95 OSR2 až po Windows ME.
Súborový systém FAT je relatívne jednoduchý a je podporovaný všetkými operačnými systémami pre PC. Táto vlastnosť ho činí vhodným pre použitie na disketách, flash diskoch a pamäťových kartách, ako schodnú cestu na prenášanie dát medzi rôznymi operačnými systémami. 
FAT je tabuľka obsahujúca informácie o obsadení disku v súborovom systéme vytvorenom pre DOS. Zároveň sa tak označuje zmienený súborový systém. Používa sa pre nájdenie súboru (allocation), ktorý je zapísaný na disku. 
Súborový systém FAT bol vytvorený Billom Gatesom a Marcom McDonaldom v roku 1977. V auguste 1980 Tim Paterson začlenil FAT do operačného systému 86-DOS. Prvá verzia FAT bola nazvaná FAT 12. Mala množstvo obmedzení: adresy klasterov boli 12 bitové (to obmedzovalo počet klasterov na 4096) a počet sektorov disku bol daný ako 16 bitové číslo, čo obmedzovalo veľkosť disku na 32 MB. FAT obmedzuje množstvo dát ktoré je možné uložiť na pevný disk. U staršich HDD je to 4GB.

Boot sektor

BIOS po POSTe (POST = Power on self test) načíta nultý LBA sektor jednotky na adresu 0x0000:0x7C00 a prenesie sem kontrolu (inštrukcia JMP 0x0:0x7C000). Nultý LBA sektor pevného disku a napr. diskety sa odlišuje tým, že na pevnom disku sú zaznamenané oddiely a je zvyčajne naprogramovaný tak aby načítal a spustil boot sektor aktívnej oblasti disku. Tento typ zápisu sa nazýva Master Boot Record (MBR). Ten na diskete je rovnaký ako boot sektor oddielu disku a nazýva sa Volume Boot Record.

Štruktúra súborového systému FAT

Súborový systém v MS DOSe a jemu podobných systémoch je organizovaný pomocou FAT. Rozoznávame FAT12 a FAT16 (FAT32) podľa toho, koľko bitov vyhradzuje na (logickú) adresáciu disku. FAT je jednorozmerná tabuľka (pole), ktorá obsahuje údaje o obsadenosti jednotlivých oblastí (cluster=klaster) disku/diskety. Väčšinou existujú dve kópie (ak by sa jedna (prvá) fyzicky porušila). FAT spolu s adresármi určuje fyzické uloženie súborov.
Disketa aj disk sú delené na klastre, ktoré sú z hľadiska súborového systému MS DOSu najmenšou adresovateľnou jednotkou (sú to vlastne logické bloky). Priestor na diskete sa súborom prideľuje po klasteroch. Ak napr. klaster pozostáva z 8 sektorov, t. j. má 4KB, a v adresári je 100 súborov po 100B, vznikne 10KB údajov, ale v súborovom systéme zaberajú 100x4KB=400KB miesta, t. j. využívate priestor na 2,5%. Nanešťastie počet klasterov je zhora ohraničený typom FAT: 4096 pre FAT12 (reálne o niečo menej), 65536 pre FAT16 (reálne zase o niečo menej). To je najväčší problém súborového systému typu FAT hlavne pri veľkých diskoch – vynucuje veľké klastre a tým plýtva priestorom.

Štruktúra boot sektoru

Prvá dátová štruktúra na zväzku FAT sa nazýva BPB (Bios Parameter Block). Je umiestená v prvom sektore zväzku v "rezervovanej oblasti" (tento sektor sa tiež nazýva "boot sektor", "reserved sektor" alebo "nultý sektor"). Ide o prvý sektor zväzku.

Štruktúra adresára

Adresár FAT nie je nič iné ako "súbor" zložený z lineárneho zoznamu 32 bajtových štruktúr. Jediný adresár, ktorý musí byť vždy prítomný je koreňový adresár. U médií s FAT12 / FAT16 je koreňový adresár umiestený hneď za poslednou FAT a má pevnú veľkosť v sektoroch, spočítanú z hodnoty BPB_RootEntCnt. Pre tieto média je prvý sektor koreňového adresára daný číslom sektora vzťahujúcim sa k prvému sektoru zväzku FAT

Dlhý adresárový záznam

Dlhé mena sú obmedzene na 255 znakov bez zakončovacieho NUL. Celková dĺžka potom nesmie prekročiť 260 znakov. Dá použiť akákoľvek kombinácia znakov definovaných pre krátke mená a navyše je pridaná ".", ktorá môže byť použitá opakovane. Medzera je tiež platný znak dlhého mena, rovnako ako u krátkeho mena kde sa tiež často nevyužívala. Nasledujúcich šesť znakov bolo v prípade krátkeho mena zakázané, ale u dlhého mena je možno ich použiť. 
$ + , ; = [ ]
Vložené medzery vo vnútri dlhého mena sú povolené, ale na začiatku a na konci názvu sa ignorujú. Počiatočné a vložené bodky sú povolené, ale bodky na konci sa ignorujú. Dlhé mená sú uložene v DAZ v kódovaní UNICODE. Znak v UNICODE je má 16 bitov a je tiež nemožné uložiť takýto znak v KAZ, pretože tu sú znaky uložene osembitovo alebo v DBSC kóde. Dlhé mena prešli cez súborový systém nie sú prevedené na veľké znaky a ich pôvodná hodnota je zachovaná. UNICODE rieši problém s mapovaním veľkých a malých písmen bežných u niektorých OEM kódových stránok automatickým prevodom malých znakov na jednotné veľké znaky.

Krátky adresárový záznam

Krátke mená sú obmedzene na 8 znakov nasledovaných voliteľnou bodkou a maximálne 3-písmenovou príponou. Celková dĺžka cesty krátkeho mena nemôže prekročiť 80 znakov (64 znakov cesta + 3 písmeno jednotky + 12 pre meno 8.3 + NUL) vrátané ukončenia NUL. Znaky môžu byť ľubovoľnou kombináciou písmen, číslic alebo znakov s kódovou hodnotou väčšou ako 127. Nasledujúce znaky sú taktiež povolene:
$ % ' - _ @ ~ ` ! ( ) { } ^ # &
Mená sú uložene v KAZ v OEM kódovej stránke systému, na ktorú je systém nakonfigurovný v dobe vytvorenia AZ. KAZ zostávajú v OEM kvôli kompatibilite so staršími verziami OS. OEM znaky sú jednotlivé 8 bitové znaky alebo pre určité kódové stránky to môžu byť DBCS znakové páry.

Určenie začiatku dátovej oblasti

FirstDataSector = BPB_ResvdSecCnt + (BPB_NumFATs * FATSz) + RootDirSectors;

Vytvorenie položky v adresári (krátky, dlhý názov)

1. alokuj voľný klaster

2. zapíš prvú časť súboru do tohoto klastera

3. ak neexistuje ďalšia časť súboru koniec

4. alokuj voľný klaster

5. zápis ďalšiu časť súboru do tohto klastera

6. goto 3

Zmazanie položky v adresári (krátky, dlhy názov)

1. nájdi začiatočný klaster súboru

2. nastav obsah tohto klastera na hodnotu 0xE5

Prehľadávanie adresára - hľadanie zadaného súboru

1. načítaj ďalší klaster adresára (ak neexistuje, koniec – súbor sa nenašiel)

2. ak je klaster začiatkom súbora porovnaj názov s názvom súboru (ak sa rovnajú, koniec – našiel)

3. ak nie, goto 1

Určenie nasledujúceho klastera v reťazci

1. načítaj hodnotu v FAT tabuľke z indexu zodpovedajúcemu číslu aktuálneho klastera

Alokácia voľného klastera

1. prehľadaj FAT dokiaľ nenájdeš voľný klaster

2. nastav tento klaster ako nasledujúci použiteľný

Čítanie n bajtov zo súboru

1. nájdi prvý klaster súboru

2. prečítaj obsah klastera

3. i = i + 1

4. ak je n > veľkosť klastera*1 goto 1