Introduction
La FAT, tirant son nom de l'abréviation de l'anglicisme «File Allocation Table», soit table d'allocation de fichiers, est un format de partition permettant d'entreposer des fichiers autant sur une disquette qu'un disque dur. Il a été conçu à l'origine par Bill Gates et Marc McDonald pour le Microsoft Disk BASIC puis fusionner avec le QDOS (allant devenir le MS-DOS).
Format
A l'origine il existait seulement la FAT12 et la FAT16, mais il existe maintenant 5 formats différents :
Nom | Description |
---|---|
FAT12 | Ce type de FAT permet un maximum de 212, soit 4 096 unité d'allocation de taille fixe (entre 512 octets et 4 Kilooctets). Étant donné la petite taille qu'il supporte, il principalement utilisé pour le support des disquettes. |
FAT16 | Ce type de FAT permet un maximum de 216, soit 65 536 unité d'allocation de taille fixe (entre 2 Kilooctets et 64 Kilooctets). Ce format est utilisé pour la gestion des disques dur de tous les MS-DOS vendu, soit de la version 1 à la version 6. |
FAT32 | Ce type de FAT est apparut en même temps que Windows 95 et permet un support de 228 unité d'allocation de taille variable (entre 4 Kilooctets et 32 Kilooctets). La taille des fichiers ne peut toutefois dépasser la limite de 4 Gigaoctets. |
VFAT | Ce type de FAT est une évolution de la FAT (FAT12, FAT16 et FAT32), elle permet la gestion des noms long afin de ne plus être limité à 8 caractères de noms et 3 d'extensions, mais d'aller jusqu'à 255 caractères. |
exFAT | Ce type de FAT est destiné au système d'exploitation Windows CE version 6 ou supérieur. |
Depuis que le DOS fut remplacé par le système d'exploitation Windows, on utilise maintenant la FAT (FAT16 ou FAT32) essentiellement pour des clefs USB.
Structure de la partition
Le premier secteur, appeler «BPB», pour l'abréviation de l'anglicisme «Bios Parameter Block», contient les informations sur la structure de la partition. Voici la structure du BPB :
Déplacement | Taille | Description | ||
---|---|---|---|---|
00h | 0 | 3 octets | Ce champ contient les instructions assembleur 80x86 (JMP) vers un programme allant charger le système d'exploitation. | |
03h | 3 | 8 octets | Ce champ contient le nom du programme ayant formaté le disque. Exemple «IBM 7.0», «MSWIN4.1»,... | |
0Bh | 11 | 2 octets | Ce champ permet d'indiquer le nombre d'octets par secteur, soit 512, 1 024, 2 048 ou 4 096. | |
0Dh | 13 | 1 octet | Ce champ permet d'indiquer le nombre de secteurs par unité d'allocation, soit 1, 2, 4, 8, 16, 32, 64 ou 128. | |
0Eh | 14 | 2 octets | Ce champ permet d'indiquer le nombre de secteurs réservés en incluant le secteur de démarrage. La valeur par défaut est 32 pour la FAT32 et 1 pour les FAT12 et FAT16. | |
10h | 16 | 1 octets | Ce champ permet d'indiquer le nombre de FATs sur le disque. La valeur par défaut est 2 si elle contient 0. | |
11h | 17 | 2 octets | Ce champ permet d'indiquer la taille du répertoire principale (racine). Le calcul se fait en nombre d'entrées. La valeur par défaut de la FAT32 est 0. | |
13h | 19 | 2 octets | Ce champ permet d'indiquer le nombre total de secteurs si la taille de champ est en 16 bits. La valeur par défaut est 0 pour la FAT32. | |
15h | 21 | 1 octet | Ce champ permet d'indiquer le type de disque : | |
Valeur | Description | |||
E5h | Cette valeur permet d'indiquer une disquette 8 pouces (200 mm) simple face, 77 pistes par côté, 26 secteurs par piste, 128 octets par secteur (250,25 Ko). Cette valeur est réservé pour le DR-DOS. | |||
EDh | Cette valeur permet d'indiquer une disquette de 5,25 pouces (130 mm) double face, 80 pistes par côté, 9 secteurs, 720 Ko. Cette valeur est uniquement utilisé sous le Tandy 2000. | |||
EEh | Cette valeur permet d'indiquer une partition personnalisées non standard (utilisant des formats BPB non standard ou nécessitant un accès multimédia spécial tel que l'adressage 48 bits ou 64 bits) ; correspond à 0xF8, mais non reconnu par les systèmes inconscients par conception ; la valeur ne doit pas nécessairement être identique à l'ID de la FAT, jamais utilisée comme marqueur de fin de chaîne d'unité d'allocation. Cette valeur est réservé pour le DR-DOS. | |||
EFh | Cette valeur permet d'indiquer le format superfloppy personnalisés non standard ; correspond à F0h, mais non reconnu par les systèmes inconscients par conception ; la valeur ne doit pas nécessairement être identique à l'ID de la FAT, jamais utilisée comme marqueur de fin de chaîne d'unité d'allocation. Cette valeur est réservé pour le DR-DOS. | |||
F0h | Cette valeur permet d'indiquer une unité de disquette. | |||
F4h | Cette valeur permet d'indiquer un disque de double densité dans l'édition Altos MS-DOS 2.11 seulement. | |||
F5h | Cette valeur permet d'indiquer un disque dur de 4 côtés, 12 secteurs par piste dans l'édition Altos MS-DOS 2.11 seulement. | |||
F8h | Cette valeur permet d'indiquer un disques dur | |||
F9h | Cette valeur permet d'indiquer une disquette double face, 15 secteurs/piste | |||
FAh | Signification variable selon le système : disque dur pour Tandy 1000 MS-DOS 2.11 ou Tandy 1000 MS-DOS 3.2, disque en RAM, 8 secteurs /piste de 320 Ko,... | |||
FBh | Cette valeur permet d'indiquer une disquette double face, 80 pistes par côté (640 Ko) | |||
FCh | Cette valeur permet d'indiquer une disquette simple face, 9 secteurs/piste | |||
FDh | Cette valeur permet d'indiquer une disquette double face, 9 secteurs/piste | |||
FEh | Cette valeur permet d'indiquer une disquette simple face, 8 secteurs/piste | |||
FFh | Cette valeur permet d'indiquer une disquette double face, 8 secteurs/piste | |||
16h | 22 | 2 octets | Ce champ permet d'indiquer la taille d'une FAT en secteurs. La valeur par défaut de la FAT32 est 0. | |
18h | 24 | 2 octets | Ce champ permet d'indiquer le nombre de secteurs par piste. | |
1Ah | 26 | 2 octets | Ce champ permet d'indiquer le nombre de têtes. | |
1Ch | 28 | 4 octets | Ce champ permet d'indiquer le nombre de secteurs cachés. La valeur par défaut 0 si le disque n'est pas partitionné. | |
20h | 32 | 4 octets | Ce champ permet d'indiquer le nombre total de secteurs si la taille du champ est en 32 bits. Ce champ est remplis si celui en 16 bits contient 0. | |
Si FAT12/FAT16 : | ||||
24h | 36 | 1 octet | Ce champ permet d'indiquer l'identificateur du disque : | |
Valeur | Description | |||
00h | Cette valeur permet d'indiquer un disque amovible. | |||
80h | Cette valeur permet d'indiquer un disque fixes. | |||
25h | 37 | 1 octet | Ce champ est réservé. | |
26h | 38 | 1 octet | Ce champ contient la signature. La valeur par défaut est 29h. | |
27h | 39 | 4 octets | Ce champ contient le numéro de série du disque. | |
2Bh | 43 | 11 octets | Ce champ contient le nom du volume sur 11 caractères. S'il n'a pas de nom, il contiendra «NO NAME». | |
36h | 54 | 8 octets | Ce champ permet d'indiquer le type de système de fichiers : FAT, FAT12, FAT16. | |
Si FAT32 : | ||||
24h | 36 | 4 octets | Ce champ permet d'indiquer la taille d'une FAT en secteurs. | |
28h | 40 | 2 octets | Ce champ permet d'indiquer les attributs du disque. | |
2Ah | 42 | 1 octet | Ce champ permet d'indiquer la version majeure du système de fichiers. La valeur par défaut est 0. | |
2Bh | 43 | 1 octet | Ce champ permet d'indiquer la version mineure du système de fichiers. La valeur par défaut est 0. | |
2Ch | 44 | 4 octets | Ce champ permet d'indiquer le numéro de la première unité d'allocation du répertoire principale (racine). | |
30h | 48 | 2 octets | Ce champ permet d'indiquer les informations complémentaires sur le système de fichiers. La valeur par défaut est 1. | |
32h | 50 | 2 octets | Ce champ permet d'indiquer le numéro de secteur de la copie du secteur de démarrage. | |
34h | 52 | 12 octets | Ce champ est réservé. La valeur par défaut est 0. | |
40h | 64 | 1 octet | Ce champ permet d'indiquer l'identificateur du disque : | |
Valeur | Description | |||
00h | Cette valeur permet d'indiquer un disque amovible. | |||
80h | Cette valeur permet d'indiquer un disque fixes. | |||
41h | 65 | 1 octet | Ce champ est réservé. | |
42h | 66 | 1 octet | Ce champ contient la signature. La valeur par défaut est 29h. | |
43h | 67 | 4 octets | Ce champ contient le numéro de série du disque. | |
47h | 71 | 11 octets | Ce champ contient le nom du volume sur 11 caractères. S'il n'a pas de nom, il contiendra «NO NAME». | |
52h | 82 | 8 octets | Ce champ permet d'indiquer le type de système de fichiers. La valeur est «FAT32». |
Structure d'une entrée
Afin de répertorié chacun des fichiers contenu dans une partition FAT, des entrées sont contenus dans des secteurs (en raison de 16 entrées (de taille de 32 octets) par secteurs). Le répertoire principale (racine) contient donc un facteur de 16 entrées répertoriant des fichiers et des répertoires enfants. Voici la structure d'une de ses entrées :
Déplacement | Taille | Description | ||
---|---|---|---|---|
00h | 8 octets | Ce champ contient le nom du fichier. Si le nom ne contient pas 8 caractères, il faut le complété avec des espaces. Le premier caractère de ce champ peut avoir une signification spéciale. Voici la liste des valeurs spéciales : | ||
Valeur | Description | |||
00h | Cette valeur permet d'indiquer une entrée qu'il s'agit de la dernière entrée du groupe. | |||
05h | Cette valeur permet d'indiquer que le nom du fichier commence par la caractère ASCII E5h. | |||
2Eh | Cette valeur permet d'indiquer une entrée parent ou enfant de répertoire. Le nom peut être «.» ou «..». | |||
E5h | Cette valeur permet d'indiquer que le fichier a été supprimé. A ce stade, le fichier peut être restauré par un utilitaire (UNDELETE par exemple) | |||
08h | 3 octets | Ce champ contient l'extension du fichier. L'extension peut être de 1 à 3 caractères et s'il est incomplet, il faut le complété avec des espaces. | ||
0Bh | 1 octet | Ce champ contient l'attribut du fichier. Les attributs sont des bits pouvant être combiné avec les significations suivantes : | ||
Bits | Masque | Description | ||
0 | 01h | Ce bit permet d'indiquer un attribut en lecture seulement. | ||
1 | 02h | Ce bit permet d'indiquer un attribut en fichier caché. | ||
2 | 04h | Ce bit permet d'indiquer un attribut en fichier système. | ||
3 | 08h | Ce bit permet d'indiquer un attribut en nom de volume. | ||
4 | 10h | Ce bit permet d'indiquer un attribut en sous-répertoire. | ||
5 | 20h | Ce bit permet d'indiquer un attribut d'archive. | ||
6 | 40h | Ce bit permet d'indiquer un attribut de périphérique. Utilisé uniquement pour des usages internes du système d'exploitation. | ||
7 | 80h | Ce bit n'est pas utilisé. | ||
0Ch | 1 octet | Ce champ n'est pas utilisé. | ||
0Dh | 1 octet | Ce champ permet d'indiquer l'heure de création en unité de 10 millisecondes (0 à 199) | ||
0Eh | 2 octets | Ce champ permet d'indiquer l'heure de création entreposé sous forme de bits : | ||
Bits | Description | |||
0 à 4 | Ces bits permettent d'indiquer les secondes divisés par 2. Les valeurs sont entre 0 et 29 | |||
5 à 10 | Ces bits permettent d'indiquer les minutes. Les valeurs sont entre 0 et 59 | |||
11 à 15 | Ces bits permettent d'indiquer les heures. Les valeurs sont entre 0 et 23 | |||
10h | 2 octets | Ce champ permet d'indiquer la date de création entreposé sous forme de bits : | ||
Bits | Description | |||
0 à 4 | Ces bits permettent d'indiquer le jour du mois, soit des valeurs entre 1 et 31. | |||
5 à 8 | Ces bits permettent d'indiquer le mois. Ainsi, 1 = janvier, 2 = février, ..., 12 = décembre. | |||
9 à 15 | Ces bits permettent d'indiquer l'année à partir de 1980. Ainsi, 0 = 1980, 1 = 1981, 2 = 1982,..., 127 = 2107 | |||
12h | 2 octets | Ce champ permet d'indiquer la date de dernier accès entreposé sous forme de bits : | ||
Bits | Description | |||
0 à 4 | Ces bits permettent d'indiquer le jour du mois, soit des valeurs entre 1 et 31. | |||
5 à 8 | Ces bits permettent d'indiquer le mois. Ainsi, 1 = janvier, 2 = février, ..., 12 = décembre. | |||
9 à 15 | Ces bits permettent d'indiquer l'année à partir de 1980. Ainsi, 0 = 1980, 1 = 1981, 2 = 1982,..., 127 = 2107 | |||
14h | 2 octets | Ce champ permet d'indiquer l'index EA sous OS/2 et Windows NT et indique les 2 octets de poids fort de la première unité d'allocation sous la FAT32. | ||
16h | 2 octets | Ce champ permet d'indiquer l'heure de la dernière modification entreposé sous forme de bits : | ||
Bits | Description | |||
0 à 4 | Ces bits permettent d'indiquer les secondes divisés par 2. Les valeurs sont entre 0 et 29 | |||
5 à 10 | Ces bits permettent d'indiquer les minutes. Les valeurs sont entre 0 et 59 | |||
11 à 15 | Ces bits permettent d'indiquer les heures. Les valeurs sont entre 0 et 23 | |||
18h | 2 octets | Ce champ permet d'indiquer la date de la dernière modification entreposé sous forme de bits : | ||
Bits | Description | |||
0 à 4 | Ces bits permettent d'indiquer le jour du mois, soit des valeurs entre 1 et 31. | |||
5 à 8 | Ces bits permettent d'indiquer le mois. Ainsi, 1 = janvier, 2 = février, ..., 12 = décembre. | |||
9 à 15 | Ces bits permettent d'indiquer l'année à partir de 1980. Ainsi, 0 = 1980, 1 = 1981, 2 = 1982,..., 127 = 2107 | |||
1Ah | 2 octets | Ce champ permet d'indiquer le numéro de la première unité d'allocation (FAT12 et FAT16); 2 octets de poids faible de ce numéro avec le FAT32. | ||
1Ch | 4 octets | Ce champ permet d'indiquer la taille du fichier. |
Résolutions de problèmes
Si vous avez des problèmes avec une partition FAT, normalement, la commande CHKDSK devrait être en mesure de résoudre le problème. Toutefois, il est souvent préférable d'utiliser des utilitaires comme le Norton Disk Doctor pour résoudre correctement le problème.
- Si vous avez des problèmes de fichiers mélanger, avec des symptômes comme des images grisées et des couleurs incohérente par exemple, il s'agit assez souvent d'un problème d'un mélange de la première table de FAT et de la deuxième table de FAT n'ayant pas terminé sa mise à jour et n'ayant jamais été compléter par le système d'exploitation. Ce genre de situation se produit lorsqu'on retire trop rapidement un unité de disque avant que l'opération ne soit terminé. Dans ce genre de situation, la récupération est difficile et hasardeuse.
Code source
Voici des exemples de code source de pour examiner l'entête de la FAT :
Lien | Langage de programmation | Projet |
---|---|---|
https://github.com/gladir/corail/blob/master/DISKINFO.PAS | Free Pascal | Corail |
https://github.com/gladir/corail/blob/master/DOSDIR.PAS | Free Pascal | Corail |