Je me suis intérressé à la FAT32 afin de pouvoir sauvegarder des données sur une carte SD, le tout dans un fichier texte.
La raison pour laquelle j'ai opté pour un système de FAT32 c'est que je souhaitait pouvoir stocker beaucoup de fichiers sur un volume relativement grand. De plus, les fichiers devrontait pouvoir êtres relus, modifiés, supprimés etc.. sur un ordinateur de bureau classique.
Vous trouverez sur cette page, toutes les informations glannées sur le web, mes constats personnels et quelques datasheets.
Le premier secteur physique est le Master Boot Record. Il contient les informations utiles pour Booter le support, il contient aussi les informations sur les partitions présentes sur le support.
Chaque partition peut être formatée selon un systeme de fichier différent.
Généralement les cartes SD et MMC ont seulement une seule partition active, organisé de la sorte :
Boot Secteur : c’est le 1er secteur logique de la partition, il contient diverses informations relatives à l’organisation logique du support.
FAT : Indique comment les clusters sont organisés en fonction des fichiers et repertoires. Généralement il y a 2 copie de la FAT ce qui permet d’avoir une redondance des données en cas de corruption.
Root Directory : En FAT32, le Root Directory peut être placé à n’importe quel endroit du support. Cette zone regroupe les différentes entrées des répertoires, sous-répertoires et des fichiers. Sont stockés ici, le nom, l’extension dans le cas d’un fichier, l’attribut, l’heure et la date de la création et du dernier accès, l’adresse où trouver les données relatif au fichier et la taille des données.
Data Region : Zone où sont stockés les données des répertoires et des fichiers. Les données sauvegardées ici, restent présentes mêmes si les fichiers ou répertoires sont effacés.
Afin de pouvoir lire toutes les zones du support, plusieurs logiciels ont été utilisés, certains gratuit, d'autres non. Chaque logiciel possède ses propres particuliarités, a vous de voir celui qui vous convient le mieux (personnellement, je pense qu'il faut jongler entre plusieurs) :
En cas de modification malheureuse de ce secteur (cela m'est arrivé plusieurs fois), il est impossible de formatter le support avec les moyens traditionnels, ce soft est là pour vous sauver le support.
Dans les 446 premiers octets du MBR sont contenus les informations utiles pour Booter le support. Il s'en suit ensuite la table de partition qui contient les 4 entrées des 4 Partitions présentes sur le suppport. Chaque entrée de partition a une longueur de 16 octets. (voir fig. 2).
Afin de valider ce secteur les octets 0x55 et 0xAA sont ecrits à la fin de ce secteur.
Attention : Le MBR est configuré en usine. Ecrire dans cette zone peut rendre le support inutilisable.
Exemple SD 2Go EMTEC :
Nom du Secteur : MASTER BOOT RECORD
Adresse sur le support : 0x00000000
VERT : les 446 Octets de boot.
ROUGE + ROSE : Table de partition.
ROUGE : Entrée de la partition 1
ROSE : Entrées des partitions 2,3,4 (non présente ici)
BLEU : Octets de validation.
ROUGE (Entrée de la FAT1) : "00 02 08 00 0B 3F FF BF 85 00 00 00 7B 0F 3B 00"
[1] | Boot | 00 | Partition Non Bootable | |
[2-4] | First Partition Sector | 02 08 00 | 0x000802 | |
[5] | File System | 0B | ||
[6-8] | Last Partition Sector | 3F FF BF | 0xBFFF3F | 12 582 719 |
[9-12] | >Offset 1er Sect de la Partition (Nb Sect) | 85 00 00 00 | 0x00000085 | 133 sect |
[13-16] | Nb de Secteur ds la Partition | 7B 0F 3B 00 | 0x003B0F7B | 3 870 587 sect |
Nous connaissons maintenant l'endroit où se trouve le Boot Secteur par rapport à l'adresse du MBR grâce à l'Offset 1er Sect de la Partition, à savoir 133 secteur plus loin.
C’est le premier secteur logique du support.
Sont stockés ici les différentes informations sur l’organisation logique du support ainsi que diverses autres informations tels que n° serie, nom du Fab etc...
Ainsi il est possible de voir, que sur un système FAT32 standard, un Secteur est composé de 512 octets, un Cluster est composé de 8 Secteurs etc...
Ces informations sont indispensables afin de pouvoir déterminer le type de formatage du support (FAT12,16,32,...). l'endroit où se trouve la Root Directory etc..
Exemple SD 2Go EMTEC :
Nom du Secteur : BOOT SECTOR
Adresse sur le support : 0x00010A00
VIOLET : Nb d’octets par Secteur.[BPB_BytsPerSec]
BLEU CIEL : Nb de Secteurs par Cluster.
VERT : Nb de Secteurs réservés[BPB_ResvdSecCnt]
JAUNE :Nb de FAT Structure (Backup FAT).[BPB_NumFATs]
ORANGE : Nb total de Secteur dans la Partition
ROUGE :Nb de Sect occupés par une FAT [FATSz]
BLEU :Octets de validations.
A partir de là, nous pouvons déterminer le nombre de secteurs occupés par la Root Directory, selon la formule suivante :
Remarque : Sur un Volume Fat32, BPB_RootEntCnt est égale à 0. Donc RootDirSectors est égale à 0.
RootDirSectors= (BPB_RootEntCnt * 32) + (BPB_BytsPerSec-1)) / BPB_BytsPerSec
FirstDataSector = BPB_ResvdSecCnt + (BPB_NumFATs * FATSz) + RootDirSectors
ADR_FAT1 = Adresse BS + ( BPB_ResvdSecCnt * BPB_BytsPerSec )
ADR_FAT2 = ADR_FAT1 + ( BPB_FATSz32 * BPB_BytsPerSec )
ADR_RD = Adresse BS + ( FirstDataSector * BPB_BytsPerSec )
FirstSectorofCluster = ((N – 2) * BPB_SecPerClus) + FirstDataSector
La FAT est la zone où est indiqué comment sont structuré les fichiers, répertoires, et la Root Directory. Chaque position est composée de 4 octets. Les positions 1 & 2 sont réservées, et toutes les autres représentent un numéro de cluster où se trouve les données des répertoire, fichiers, Root Directory.
Exemple : La FAT est vierge de tout fichier.
Les positions 1 & 2 sont réservées et portent les infos 0F FF FF F8 & 0F FF FF FF.
La position 3 représente le Cluster n°2, 1er cluster de libre. Il est réservé pour la Root Directory. Il porte l’info 0F FF FF FF, ce qui veut dire que pour le moment seul ce cluster est utilisé pour la Root Directory.
Toutes les autres positions sont marqué par 00 00 00 00, c'est-à-dire qu’il sont disponibles, il n’y a pas de fichiers de stocké sur le support
Remarque : Les deux premières entrées de la FAT qui pointent vers le cluster 0 et le cluster 1 sont réservés et de ce faîte le premier cluster disponible est le Cluster 2.
Description des marqueurs de position :
Chaque fichier occupe au minimum un cluster (donc 8 secteurs de 512 octets), même si le fichier ne fait que 1 octets en taille. Le reste du cluster est donc perdu sauf si la taille du fichier est modifiée.
Si la taille du fichier est inférieure à la taille d’un cluster, alors l’entrée de la FAT de ce cluster contiendra la valeur « Dernier Cluster d’un fichier », ceci pour indiquer qu’il n’y a pas d’autre cluster associé à ce fichier.
Si la taille du fichier est supérieur à la taille d’un cluster, alors l’entrée de la FAT de ce cluster contiendra le n° du cluster constituant la suite du fichier.
De cette façon il est possible de stocker de grands fichiers mêmes si ses clusters ne sont pas consécutifs. (Comme, par exemple, si un 2e fichier est crée puis si ensuite on rajoute suffisamment de données dans le 1er fichier).
Principe de chaînage des fichiers :
Le 1er cluster de chaque fichier et indiqué dans la « Root Directory » à l’emplacement de l’entrée du fichier concerné.
Ici :
Le fichier n°1 et le fichier n°3 ont une taille inférieure à un cluster, donc l’entrée de la FAT correspondant à ces fichiers contiendra la valeur « Dernier Cluster d’un Fichier ». 1 Cluster entier sera associé pour chacun de ces fichiers.
Le fichier n°2 a une taille supérieure à 3 clusters et inférieure à 4 clusters. Lorsque le fichier n°2 a été créé, il n’y avait que 2 clusters consécutifs (cluster 4 et cluster 5), il a donc été nécessaire de réserver d’autres clusters, non consécutifs aux deux premiers, (cluster 7 et cluster 8).Ceci est appelé « fragmentation ». Le cluster 8 est le dernier cluster utilisé pour ce fichier car il comporte d’indication « Dernier Cluster d’un Fichier ».
Au fur et a mesure de l’ajout, suppression, modification de fichiers, le chaînage des fichiers peux s’avérer très complexe et un fichier peux occuper plusieurs clusters non contigus et enchevêtrés de nombreuses fois au milieu d’autres cluster représentant d’autres fichiers. Ralentissant ainsi la lecture complète du fichier par le faîte qu’il faille suivre l’indexation ainsi réalisé dans la FAT.
Les logiciels de défragmentation corrige ce phénomène en essayant au maximum d’attribuer à chaque fichier des clusters contigus évitant ainsi de multiples sauts dans la FAT.
Cependant dès qu’un fichier est modifié (taille) ou supprimé un « espace vide » (cluster de libre) se créer au milieu des autres fichiers et le problème de fragmentation réapparaît.
La Root directory est la zone où sont stockés toutes les informations sur les répertoires et les fichiers. (Nom, Extension, Attributs, Heures de création de modification, de dernier accès,…).
Cett zone commence directement après le dernier cluster de la FAT. Toutefois et contrairement au système de FAT16, la Root Directory n’a pas de taille prédéfinie : Dès que le 1er cluster (les 8 secteurs de ce cluster) de la Root directory est plein, le système cherche alors dans la table de la FAT, un autre cluster de libre. La Root Directory peut donc occuper plusieurs clusters de façon contigus ou non.
Les différents clusters ainsi utilisés sont donc dit « chaînés » et le principe de chaînage de ces clusters est le même que celui employé par les données des fichiers.
« Début du la Root Directory (cluster 1, secteur 1) :
Nom du Secteur : ROOT DIRECTORY
Adresse sur le support : 0x00010A00
VIOLET : Label du support
BLEU : Fichier (8.3 Format, nom Court)
VERT : Répertoire
BLEU (Fichier) : Nom Court du fichier sur 8 Octets
Chaque entrées est une zone de 32 octets composé comme suit :
[1-8] |
Nom du fichier (court) |
41 42 43 44 45 46 47 48 |
ABCDEFGH |
|
[9-11] |
Extension du fichier |
54 58 54 |
TXT |
|
[12] |
Attribut |
20 |
Attribut Archive |
|
[13] |
Réservé |
10 |
||
[14] |
Heure de Création (ms) |
A8 |
168 |
|
[15-16] |
Heure de Création |
74 74 |
29 812 |
14:35:40 |
[17-18] |
Date de Création |
3A AB |
15 019 |
11/05/2009 |
[19-20] |
Date dernier Accès |
3A AB |
15 019 |
11/05/2009 |
[21-22] |
1er Cluster MSB |
00 00 |
|
|
[23-24] |
Heure d’écriture |
74 6B |
29 803 |
14:35:22 |
[25-26] |
Date d’écriture |
3A AB |
15 019 |
11/05/2009 |
[27-28] |
1er Cluster LSB |
00 03 |
|
|
[29-32] |
Taille du fichier (Octet) |
00 00 00 1A |
26 octets |
|
Les octets de 1 à 8 contiennent le nom du fichier ou du répertoire.
Les octets de 9 à 11 contiennent l'extension du fichier.
Le premier caractère du nom de fichier ou répertoire (Octet 1) peut prendre plusieurs valeurs :
Ainsi pour effacer un fichier il suffit de modifier le 1er octet du nom de fichier et de la remplacer par 0xE5.
L’entrée du fichier est toujours présente dans la RD,
0x01 | 0000 0001 | Read Only | Indique qu'une écriture sur ce fichier échouera |
0x02 | 0000 0010 | Hidden | Indique de ne pas montrer ce fichier |
0x04 | 0000 0100 | System | Indique que c'est un fichier système |
0x08 | 0000 1000 | Volume ID | Il doit il y avoir une entrée sur le support avec cet attribut. Cette entrée doit être dans le répertoire racine. Le nom de cette entrée est le Label du support. "First Cluster High et Low" doivent êtres à "0" pour cette entrée. Il n'y a pas de Clusters associés à cette entrée. |
0x10 | 001 0000 | Directory | Indique que cette entrée est un répertoire |
0x20 | 0010 0000 | Archive | Cet attribut est mis à "1" par le driver de FAT lorsque le fichier est créé, renommé ou écrit. Cet attribut est utilisé par certains utilitaire de Backup afin de déterminer quels fichiers ont étés modifiés depuis la dernière opération de Backup |
00xx 1111 | Long Name | Read Only | Hidden | Systm | Volume ID (Non traité ici actuellement) |
Fig 6: Octet Attribut : b7 et b6 toujours à 0.
Ces données sont sauvegardées, sur 2 octets pour chacune des informations, les Dates et les Heures de la création et du dernier accès du fichier ou répertoire.
Indique le premier cluster constituant le début du fichier. Afin de déterminer les autres cluster appartenant à ce fichier (si il y en a) il faut aller lire la FAT.
Indique la taille du fichier en octets.
(Pas traité encore).
Exception fait pour le répertoire racine, les autres répertoires sont écrits de la même façon que les fichiers.
Chaque répertoires occupent un ou plusieurs Clusters dans la Data section de la partition.
Chaque répertoire ont leur propre entrée dans la « Root directory » et ont leur propre chaînage dans la FAT.
Le Bit 4 de l’octet attribut dur « Root Directory » d’un répertoire indique que ce répertoire appartient à un répertoire.
La constitution des noms des répertoires a le même format que les noms de fichier (8.3 format), sauf qu’il n’ont pas d’extension.
(NON TRAITE ICI ACTUELLMENT)
Voici un petit exemple sur le principe de chaînage en FAT de la Root Directory selon le nombre de fichier contenu sur le support :
La FAT indique que seul le Cluster n°2 est attribué pour la RD. (Attribution par défaut). Aucuns autres cluster n’est utilisé pour la RD ou pour les datas des fichiers.
Cluster 2, Secteur 1 : La RD est vierge, il n’y a donc pas de fichier sur le support
La FAT indique toujours que seul le Cluster n°2 est attribué pour la RD. Les Clusters n°3 & 4 & 5& 6 & 7 sont quant à eux utilisés par un seul et même fichier. Le Cluster n°7 est le dernier cluster utilisé pour ce fichier ( 0F FF FF FF).
Le fichier utilise dans ce cas là des clusters contigus.
La RD, n’est plus vierge, 1 fichier est présent et son nom est du type Short File Name : « 09_12_01.TXT ».
Dans ces quelques octets sont stockés entre autre, le nom et extension du fichier, les diverses heures, la taille du fichier, l’emplacement du 1er Cluster où se trouvent les données du fichier.
Pas de changement dans la FAT, car tous les autres fichiers rajoutés ont une taille nulle (ils sont vides).
Il n’y a pas lieu de leur allouer des Clusters pour le moment.
Cluster 2, Secteur 1 : La RD montre que le secteur n°1 du cluster n°2 est totalement plein, la suite des fichier se fera donc sur le secteur n°2 et ainsi de suite jusqu’à la fin du secteur n°8.
Ensuite il faudra trouver un autre cluster de libre.
Changement dans la FAT, car le 1er Cluster (n°2) de la RD est rempli avec les 128 entrées de fichiers.
Il a donc fallu trouver un autre cluster de libre afin de marquer l’entrée du 129e fichier.
Le prochain cluster libre est donc le cluster n°8. Dans la table de la FAT et à l’emplacement du cluster n°2 les octets de « Dernier cluster de fichier » ( 0F FF FF FF) ont été remplacé par le numéro du cluster composant la suite de la RD ( 00 00 00 08 ).
Comme le cluster n°8 est le dernier utilisé par la RD, les octets de « Dernier cluster de fichier » ( 0F FF FF FF) ont été marqué à cet endroit.
La RD se trouve ainsi chaîné car elle se compose du cluster n°2 puis du cluster n°8.
On peux donc remarquer que la RD peut ne pas avoir tous ses cluster contigus, tous comme les fichiers et donc être imbriqué au milieu des fichiers.
...
Selon la RD ce fichier se trouve au cluster n°3 (00 00 00 03), allons donc voir la FAT.
D’après la FAT ce fichier est composé de 5 Clusters contigus : Le n°3 & 4 & 5 & 6 & 7.
Allons voir les données...
On retrouve bien les données textes contenues au début dans le fichier ouvert sous un notepad.
On retrouve bien les données textes contenues à la fin dans le fichier ouvert sous un notepad.
Secure Digital Card Interface for the MSP430, Michigan State University.
AN1045, Microchip.
Fat32 File System Specifircation, Microsoft.
Merci de me faire part des erreurs ou omissions.