FAT16 indeling
Fysieke schijf (sector-voor-sector)
SECTOR #
========
0 +-----------------------------+
| Bootsector (BPB + code) | 512 bytes
+-----------------------------+
1 +-----------------------------+
| FAT #1 |
2 | (2 sectoren) |
+-----------------------------+
3 +-----------------------------+
| FAT #2 |
4 | (2 sectoren, kopie) |
+-----------------------------+
5 +-----------------------------+
| Root directory |
6 | (4 sectoren, vast) |
7 | 64 entries × 32 bytes |
8 | |
+-----------------------------+
9 +=============================+
| Data area begint hier |
| (= cluster 2) |
+=============================+
Data area --> clusters
Met 4 sectoren per cluster:
CLUSTER SECTORS INHOUD
========================================
2 9 – 12 Eerste data cluster
3 13 – 16
4 17 – 20
5 21 – 24
6 25 – 28
...
Voorbeeldinhoud van de disk
Stel we hebben:
C:\
├─ AUTO (directory)
│ └─ INIT.PRG (1500 bytes)
└─ README.TXT (600 bytes)
Root directory (sector 5–8)
Elke entry = 32 bytes:
ENTRY #
========
[0] AUTO ATTR=DIR FIRST_CLUSTER=2
[1] README.TXT ATTR=ARCH FIRST_CLUSTER=3
[2] 0x00 → einde directory
FAT table (logisch)
FAT ENTRY WAARDE BETEKENIS
=====================================
[0] 0xFFF8 Media descriptor (reserved)
[1] 0xFFFF Reserved
[2] 0xFFFF AUTO directory (1 cluster)
[3] 0xFFFF README.TXT (1 cluster)
[4] 0x0005 INIT.PRG → cluster 5
[5] 0xFFFF INIT.PRG einde
[6] 0x0000 Free
[7] 0x0000 Free
...
Subdirectory AUTO (cluster 2 → sector 9–12)
Inhoud van cluster 2:
OFFSET
========================================
0x0000 "." ATTR=DIR FIRST_CLUSTER=2
0x0020 ".." ATTR=DIR FIRST_CLUSTER=0
0x0040 "INIT.PRG" ATTR=ARCH FIRST_CLUSTER=4
0x0060 0x00 → einde directory
INIT.PRG (cluster 4 → 5)
cluster 4 → sector 17–20
cluster 5 → sector 21–24
INIT.PRG is 1500 bytes → past in 1 cluster, maar voorbeeld laat chaining zien.
Samenvatting in één oogopslag
[BOOT] [FAT1] [FAT2] [ROOT] [CLUSTER 2] [CLUSTER 3] [CLUSTER 4] ...
| | | | |
| | | | +--> AUTO directory data
| | | +------------> Root dir entries
| | +-------------------> FAT copy
| +--------------------------> FAT
+---------------------------------> Bootsector
En de gouden regels:
- Bootsector = 1 sector
- FATs = sectoren
- Root directory = vaste sectoren
- Clusters = alleen data area
- Cluster 2 = eerste data cluster
- Subdirectories = bestanden met directory entries
Bootsector
Offset Size Naam Betekenis
---------------------------------------------
0x0B 2 BPB_BytsPerSec Bytes per sector (meestal 512)
0x0D 1 BPB_SecPerClus Sectoren per cluster
0x0E 2 BPB_RsvdSecCnt Aantal gereserveerde sectoren. Gereserveerde sectoren beginnen bij sector 0.
0x10 1 BPB_NumFATs Aantal FATs (altijd 2)
0x11 2 BPB_RootEntCnt Aantal root directory entries
0x16 2 BPB_FATSz16 Sectoren per FAT
0x13 2 BPB_TotSec16 Totaal aantal sectoren (kleine disks)
0x20 4 BPB_TotSec32 Totaal aantal sectoren (grotere disks)
Formules:
root_start = BPB_RsvdSecCnt + (BPB_NumFATs * BPB_FATSz16); // waar begint root
root_dir_bytes = BPB_RootEntCnt * 32; // hoe groot is root in bytes
root_dir_sectors = ceil(root_dir_bytes / BPB_BytsPerSec); // aantal sectoren voor root. (volgens mij niet nodig)
first_data_sector = root_start + root_dir_sectors; // waar begint de data area? Dit is waar cluster 2 begint!
In één overzicht:
reserved_sectors = BPB_RsvdSecCnt;
fat1_start = reserved_sectors;
fat2_start = fat1_start + BPB_FATSz16;
root_start =
BPB_RsvdSecCnt
+ BPB_NumFATs * BPB_FATSz16;
root_sectors =
(BPB_RootEntCnt * 32 + BPB_BytsPerSec - 1)
/ BPB_BytsPerSec;
first_data_sector =
root_start + root_sectors;