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;
Loading…
Loading the web debug toolbar…
Attempt #