Das FAT Datei Format

 

Der Master-Boot-Record
Aufbau einer Partition
Der Boot Sektor
Die FAT (File Alocation Table)
Verzeichniseinträge
Der Infosektor

 

Der Master-Boot-Record

Festplatten beginnen mit einer Partitionstabelle auf Kopf 0, Zylinder 0 und Sektor 1. Bei Disketten entfällt diese Tabelle. Die Partitionstabelle wird auch Master-Boot-Record genannt (MBR), und hat folgenden Aufbau:

Offset Größe Funktion
0x000 446 Byte Bootcode
0x1BE 16 Byte 1. Eintrag in der Partitionstabelle 
0x1CE 16 Byte 2. Eintrag in der Partitionstabelle 
0x1DE 16 Byte 3. Eintrag in der Partitionstabelle 
0x1EE 16 Byte 4. Eintrag in der Partitionstabelle 
0x1FE 2 Byte Signatur 0xAA55

Die Partitionstabelleneinträge haben folgenden Aufbau:

Offset Größe Funktion
0x00 1 Byte 0x80: bootfähig  0x00: nicht bootfähig
0x01 1 Byte Startkopf der Partition (0 bis n)
0x02 1 Byte Bit 0-5 Startsektor (1 bis 63) Bit 6-7 sind zusätzliche Bits für den Startzylinder  
0x03 1 Byte Startzylinder  (0 bis 1023)
0x04 1 Byte OS-Type:
0x00 = Eintrag leer
0x01 = FAT12 
0x02 = Xenix
0x03 = Xenix
0x04 = FAT16 (max. 32 MB)
0x05 = extended DOS-Partition  (max. 2 GB)
0x06 = FAT16 (max. 2 GB)
0x07 = HPFS/NTFS
0x08 = AIX 
0x09 = AIX bootable
0x0A = OS/2 Bootmanager
0x0B = FAT32 (CHS Adressierung)
0x0C = FAT32 (LBA Adressierung)
0x0E = FAT16 (LBA Adressierung)
0x0F = extended Partition  (LBA,mehr als 1024 Zylinder)
0x10 = OPUS
0x11 = hidden FAT12
0x12 = Compaq diagnost
0x14 = hidden FAT16 bis 32MB
0x16 = hidden FAT16
0x17 = hidden HPFS / NTFS
0x18 = AST Windows swap
0x1B = hidden WIN95 FAT32
0x1C = hidden WIN95 FAT32 (LBA)
0x1E = hidden WIN95 FAT16 (LBA)
0x24 = NEC DOS
0x39 = Plan 9
0x3C = Partition Magic
0x40 = Venix 80286
0x41 = PPC PReP boot
0x42 = SFS
0x4D = QNX4.x
0x4E = QNX4.x 2nd partition
0x4F = QNX4.x 3rd partition
0x50 = OnTrack DM
0x51 = OnTrack DM6 Aux
0x52 = CP/M
0x53 = OnTrack DM6 Aux
0x54 = OnTrack DM6
0x55 = EZ-Drive
0x56 = Golden Bow
0x5c = Priam Edisk
0x61 = Speed Stor
0x63 = GNU HURD or SYS
0x64 = Novell NetWare
0x65 = Novell
0x70 = Disk Secure Mult
0x75 = UNIX PC/IX
0x80 = aktiv (old Minix)
0x81 = Booten von Laufwerk D:
0x82 = Linux Swap
0x83 = Linux native
0x84 = OS/2 hidden C:
0x85 = LINUX extended
0x86 = NTFS volume set
0x87 = NTFS volume set
0x8e = LINUX LVM
0x93 = Amoebla
0x94 = Amoebla BBT
0x9F = BSD/OS
0xA0 = IBM Thinkpad hidden
0xA5 = BSD/386
0xA6 = Open BSD
0xA7 = NeXT STEP
0xB7 = BSDI fs
0xB8 = BSDI swap
0xC1 = DRDOS/sec (FAT32)
0xC4 = DRDOS/sec (FAT32(LBA))
0xC6 = DRDOS/sec (FAT16(LBA))
0xC7 = Syrinx
0xDA = Non-Fs data
0xDB = Concurrent DOS , CP/M , CTOS
0xDE = Dell Utility
0xE1 = DOS access
0xE3 = DOS R/o
0xE4 = Speed Stor
0xEB = BeOS fs
0xEE = EFI GPT
0xEF = EFI (FAT12/16/32)
0xF1 = Speed Stor
0xF2 = DOS secondary
0xF4 = Speed Stor
0xFD = LINUX raid auto
0xFE = LANstep
0xFF = BBT
0x05 1 Byte Endkopf der Partition (0 bis n)
0x06 1 Byte Bit 0-5 Endsektor (1 bis 63) Bit 6-7 sind zusätzliche Bits für den Endzylinder  
0x07 1 Byte Endzylinder  (0 bis 1023)
0x08 4 Byte Anfangssektor der Partitionsdaten (absoluter LBA)
0x0C 4 Byte Größe der Partition in Sektoren

Die LBA Adressierung (large block array) ist für Festplatten mit mehr als 1024 Zylindern, bei weniger Zylindern kann weiter die CHS Adressierung verwendet werden (cylinder head sector). Bei der LBA Adressierung wird statt Kopf,Zylinder,Sektor ein 32 Bit DWORT Wert für die Sektor Adressierung verwendet.

Aus den Partitionsdaten kann die Position und Größe der logischen Laufwerke ermittelt werden. Dazu dienen die DWORD Werte bei Offset 0x08 und 0x0C. Handelt es sich bei der Partition um eine "extended Partition" so ist diese kein logisches Laufwerk sondern eine weitere Unterpartition mit einem weitern Master-Boot-Record. Zu allen Positionen der LBA's ist der Anfangssektor der "extended Partition" hinzu zu zählen.

Aufbau einer Partition

Am Anfang jeder FAT-Partition eines logischen Laufwerkes steht der Boot Sektor. Er enthält Angaben über die Größe und Art der Partition. Anschließend kommt ein Bereich mit reservierten Sektoren, in diesen kann auch eine Kopie des Bootsektors vorhanden sein. Danach kommen die FAT-Sektoren. Um eine höhere Sicherheit zu erhalten werden meist zwei FAT Tabellen verwendet, falls eine beschädigt wird. Die FAT Tabellen enthalten Informationen über die Cluster-Ketten die in den einzelnen Dateien gespeichert sind. Nach den FAT's folgt das Rootverzeichnis. Es enthält alle Dateien die im Hauptverzeichnis stehen. Bei FAT32 Partitionen ist kein Rootverzeichnis vorhanden, es ist durch eine Cluster-Kette ersetzt deren Anfang im Boot Sektor steht. Zuletzt kommen die Datensektoren. Sie sind in einzelne Cluster unterteilt. Jeder Cluster besteht aus ein oder mehreren Sektoren. Der erste Cluster hat die Nummer 2 und beginnt beim ersten Datensektor. 

 

 

Der Boot Sektor

Am Anfang jedes logischen Laufwerkes steht ein ein Boot Sektor der folgenden Aufbau hat:

Offset Größe Funktion
0x000 3 Byte Jump Befehl zu Bootcode
0x003 8 Byte OEM Name 
0x00B 2 Byte Bytes je Sektor
0x00D 1 Byte Sektoren je Cluster
0x00E 2 Byte Anzahl der reservierten Sektoren, relativ zum Anfang der Partition.
0x010 1 Byte Anzahl der FAT's
0x011 2 Byte Anzahl der Einträge im Hauptverzeichnis
0x013 2 Byte Anzahl der Sektoren auf der Disk
0x015 1 Byte Media Art:
0xF0 2.88 MB 3.5-inch, 2-sided, 36-sector
0xF0 1.44 MB 3.5-inch, 2-sided, 18-sector
0xF9 720 KB 3.5-inch, 2-sided, 9-sector
0xF9 1.2 MB 5.25-inch, 2-sided, 15-sector
0xFD 360 KB 5.25-inch, 2-sided, 9-sector
0xFF 320 KB 5.25-inch, 2-sided, 8-sector
0xFC 180 KB 5.25-inch, 1-sided, 9-sector
0xFE 160 KB 5.25-inch, 1-sided, 8-sector
0xF8 Festplatte
0x016 2 Byte Anzahl der Sektoren je FAT
0x018 2 Byte Anzahl der Sektoren je Spur
0x01A 2 Byte Anzahl der Leseschreibköpfe
0x01C 4 Byte Anzahl der versteckten Sektoren
0x020 4 Byte Gesamt Anzahl der Sektoren
0x024 1 Byte Physikalische Disk Nummer (0x80,0x81 ... )
0x025 1 Byte Jetziger Kopf (unbenutzt)
0x026 1 Byte Signatur
0x027 4 Byte Seriennummer
0x02B 11 Byte Laufwerksname
0x036 8 Byte System ID
0x03E 448 Byte Boot Programm
0x1FE 2 Byte Signatur 0xAA55

Bei FAT32 Partitionen ist der Bootsektor etwas anders:

Offset Größe Funktion
0x000 3 Byte Jump Befehl zu Bootcode
0x003 8 Byte OEM Name 
0x00B 2 Byte Bytes je Sektor
0x00D 1 Byte Sektoren je Cluster
0x00E 2 Byte Anzahl der reservierten Sektoren, relativ zum Anfang der Partition.
0x010 1 Byte Anzahl der FAT's 
0x011 2 Byte Anzahl der Einträge im Hauptverzeichnis  (immer 0)
0x013 2 Byte Anzahl der Sektoren (immer 0)
0x015 1 Byte Media Art:
0xF0 2.88 MB 3.5-inch, 2-sided, 36-sector
0xF0 1.44 MB 3.5-inch, 2-sided, 18-sector
0xF9 720 KB 3.5-inch, 2-sided, 9-sector
0xF9 1.2 MB 5.25-inch, 2-sided, 15-sector
0xFD 360 KB 5.25-inch, 2-sided, 9-sector
0xFF 320 KB 5.25-inch, 2-sided, 8-sector
0xFC 180 KB 5.25-inch, 1-sided, 9-sector
0xFE 160 KB 5.25-inch, 1-sided, 8-sector
0xF8 Festplatte
0x016 2 Byte Anzahl der Sektoren je FAT (immer 0)
0x018 2 Byte Anzahl der Sektoren je Spur
0x01A 2 Byte Anzahl der Leseschreibköpfe
0x01C 4 Byte Anzahl der versteckten Sektoren
0x020 4 Byte Gesamt Anzahl der Sektoren
0x024 4 Byte Anzahl der Sektoren je FAT
0x028 2 Byte Flags
0x0080: Keine FAT Spiegelung
0x000F: Anzahl der FAT's
0x02A 2 Byte Version (immer 0)
0x02C 4 Byte Cluster Nummer für Root-Verzeichnis
0x030 2 Byte Position des Infosektors (relativ zum 1. Datensektor)
1=normal
0xFFFF=keiner
0x032 2 Byte Backup Boot Sektor (6=normal)
0x034 12 Byte unbenutzt (immer 0)
0x040 1 Byte Physikalische Disk Nummer (0x80,0x81 ... )
0x041 1 Byte Jetziger Kopf (unbenutzt)
0x042 1 Byte Signatur
0x043 4 Byte Seriennummer
0x047 11 Byte Laufwerksname
0x052 8 Byte System ID
0x05A 420 Byte Boot Programm
0x1FE 2 Byte Signatur 0xAA55

Mit dem Boot Sektor wird bestimmt wie ein Laufwerk aufgebaut ist.

 

Die FAT (File Alocation Table)

In einer FAT ist für jeden Cluster ein Eintrag vorhanden. Der Eintrag bestimmt ob ein Cluster frei ist, ob er defekt ist, ob er reserviert ist, oder ob er belegt ist. Bei belegten Sektoren wird immer die Nummer des nächsten Clusters eingetragen. Damit ist es möglich Ketten aus Clustern zu definieren, die zu einer Datei gehören. In einem Verzeichniseintrag steht dann der Anfangs-Cluster dieser Dateien. Die ersten beiden Einträge in der FAT sind der Media-Deskriptor (siehe Boot Sektor bei Offset 0x15)

Die einzelnen FAT Einträge haben folgende Bedeutung:

FAT12 FAT16 FAT32  Funktion
0x000 0x0000 0x0000000  freier Cluster
 0xFF0-0xFF6 
0xFFF0-0xFFF6
---  Cluster fürs Rootverzeichnis
0xFF7 0xFFF7 0xFFFFFF7  defekter Cluster
 0xFF8-0xFFF  0xFFF8-0xFFFF  0xFFFFFF8-0xFFFFFFF
 letzter Cluster einer Datei
xxx xxxx xxxxxxxx  nächster Cluster einer Datei 

Beim FAT32 Format sind die oberen 4 Bits aller Einträge reserviert. 

Beim FAT12 Format sind die Einträge nach folgendem Format angeordnet.

Offset Funktion
n*3 -1 ...
n*3 +0 Gerader Eintrag Bits 0-7
n*3 +1 Gerader Eintrag Bits 8-11 (low), Ungerader Eintrag Bits 0-3 (high)
n*3 +2 Ungerader Eintrag Bits 4-11
n*3 +3 ...

Bei FAT16 ist jeder Eintrag ein 2 Byte WORD (little Endian), bei FAT32 ist jeder Eintrag ein 4 Byte DWORD (little Endian). Die FAT-Sektoren beginnen nach dem Bootsektor genau um die Anzahl der reservierten Sektoren später (Offset 0x0E im Boot Sektor). Die Anzahl der FAT-Sektoren berechnet sich nach folgendem Schema:

FAT_Sektoren = Anzahl_der_FATs * Sektoren_je_FAT

Nach dem FAT Sektoren kommen die Sektoren für das Root-Verzeichnis. Bei FAT32 gibt es kein Root-Verzeichnis sondern eine Cluster-Kette für das Verzeichnis. Die Größe der FAT-Einträge wird aus der Anzahl der Datensektoren berechnet:

Root_Verzeichnis_Sektoren = (Verzeichnis_Einträge*32+Byte_je_Sektoren-1) / Byte_je_Sektor  
Sektoren_Anzahl = Gesamt_Sektoren - Reservierte_Sektoren - FAT_Sektoren - Root_Verzeichnis_Sektoren 
Cluster_Anzahl  = Sektoren_Anzahl / Sektoren_je_Cluster
FAT Type Cluster Anzahl...
FAT12 ... kleiner 0xFF5
FAT16 ... kleiner 0xFFF5
FAT32 ... größer gleich 0xFFF5

Die Position des ersten Datensektors berechnet sich folgender Maßen:

Erster_Datensektor = Reservierte_Sektoren + FAT_Sektoren + Root_Verzeichnis_Sektoren  

Zum umrechnen einer Cluster-Nummer aus der FAT in eine Sektornummer kann man diese Formel verwenden:

Ssektor_Position = Erster_Datensektor + ( Cluster_Nummer - 2 ) * Sektoren_je_Cluster

 

Verzeichniseinträge

Jedes Verzeichnis besteht aus 32 Byte großen Einträgen mit folgenden Aufbau:

Offset Größe Funktion
0x00 8 Byte Dateiname
Spezial Byte am Beginn:
0x00 = Letzter Verzeichniseintrag
0x05 = Das erste Byte ist das ASCII Zeichen 0xE5
0xE5 = Der Eintrag wurde gelöscht
0x08 3 Byte Dateierweiterung 
0x0B 1 Byte Attribute 
Bit 0 = Schreibgeschützt
Bit 1 = Versteckt
Bit 2 = System
Bit 3 = Volume-Name
Bit 4 = Verzeichnis
Bit 5 = Archive
Bei LongFileName-Einträgen steht hier 0x0F
0x0C 1 Byte Reserviert 
0x0D 1 Byte Erstellungszeit 10tel Sekunde (0 bis 199)
0x0E 4 Byte Erstellungszeit
Bit 0-4 : Sekunden (immer mit 2 dividiert)
Bit 5-10 : Minute
Bit 11-15 : Stunde
Bit 16-20 : Tag
Bit 21-24 : Monat
Bit 25-31 : Jahre ab 1980
0x12 2 Byte Datum des letzen Zugriffs (unbenutzt)
Bit 0-4 : Tag
Bit 5-8 : Monat
Bit 9-15 : Jahre ab 1980
0x14 2 Byte Erster Cluster der Datei (high Word) nur für FAT32
0x16 4 Byte Zeit der letzen Änderung
Bit 0-4 : Sekunden (immer mit 2 dividiert)
Bit 5-10 : Minute
Bit 11-15 : Stunde
Bit 16-20 : Tag
Bit 21-24 : Monat
Bit 25-31 : Jahre ab 1980
0x1A 2 Byte Erster Cluster der Datei (low Word)
0x1C 4 Byte Größe der Datei in Byte

Lange Dateinamen werden aus aufeinander folgenden spezial Einträgen zusammen gesetzt die diesen Aufbau haben:

Offset Größe Funktion
0x00 1 Byte Ordinal-Nummer
Bit 0-5 = Nummer  (von n bis 1)
Bit 6    = Erster Eintrag
0x01 10 Byte Die ersten 5 Namenszeichen (Unicode)
0x0B 1 Byte immer 0x0F
0x0C 1 Byte immer 0 
0x0D 1 Byte Checksumme vom kurzen Dateinamen
0x0E 12 Byte Die nächsten 6 Namenszeichen (Unicode)
0x1A 2 Byte immer 0 
0x1C 4 Byte Die nächsten 2 Namenszeichen (Unicode)

Die Checksumme für den lange Dateinamen wird aus dem kurzen Dateinamen berechnet:

for(cs=0,i=0;i<11;i++) cs=(cs<<7)+(cs>>1)+name[i]; 

Ein langer Dateiname wird immer vor einen kurzen Dateinamen gespeichert. Er wird aus einem oder mehreren spezial Einträgen zusammengesetzt.  Beim ersten Eintrag wird die Ordinal-Nummer auf die Anzahl der Einträge gesetzt, und das 6.te Bit auf eins gesetzt. Jeder Eintrag enthält 13 Buchstaben im Unicode-Format. Der Dateiname wird dabei von hinten nach vorn zusammen gesetzt. Das heißt im ersten Eintrag stehen die letzen 13 Buchstaben des Namens. Wenn die Checksumme nicht mehr mit der des kurzen Dateinamens übereinstimmt, so ist der lange Dateiname ungültig.

Der Infosektor

Beim FAT32 Format kann ein Infosektor der Partition hinzugefügt werden. Dieser hat folgenden Aufbau:

Offset Größe Funktion
0x000 4 Byte Signatur 1 (immer 0x41615252)
0x004 480 Byte reserviert 
0x1E4 4 Byte Signatur 2 (immer 0x61417272)
0x1E8 4 Byte Anzahl der freien Cluster
0x1EC 4 Byte Position des nächsten freien Clusters
0x1F0 12 Byte reserviert 
0x1FC 4 Byte Signatur 3 (immer 0xAA550000)

Die Position des Infosektors wird relativ zum Anfang der Partition berechnet.