Renesas propone per le proprie soluzioni il suo Open Source FAT File System M3S-TFAT-Tiny SH-2A, anche meglio conosciuto come TFAT library, in grado di supportare le tre differenti tipologie di file system – ovvero FAT12, FAT16, FAT32 – ognuna con specifiche caratteristiche.
Introduzione
L’acronimo FAT sta per “File Allocation Table” e identifica le caratteristiche che deve possedere un file system; infatti, la FAT è una tabella posta in memoria che aiuta l’utilizzatore a identificare gli stati e tutti i dati dei cluster che sono presenti nel file system. Questa FAT può essere vista banalmente come una tabella di contenuti da preservare durante il suo uso; in effetti, la File Allocation Table potrebbe anche danneggiarsi provocando delle incoerenze o, nei casi più gravi, interi file, o settori, potrebbero risultare anche irraggiungibili. Tipicamente una FAT si trova o su un hard disk o su un disco esterno ma, in ambito embedded, è in una determinata locazione nella memoria RAM o flash. Il software proposto da Renesas è in grado di supportare le tre differenti tipologie maggiormente utilizzate, in altre parole la FAT12, FAT16 e FAT32. La prima non è molto conosciuta, o perlomeno lo era maggiormente in passato, e per questa ragione ci dilungheremo su alcuni suoi aspetti tecnici. La FAT12 è da sempre utilizzata in quelle applicazioni dove è presente una quantità limitata di memoria, quanto quella offerta da un floppy disk, per intenderci.
Il numero “12” ci aiuta a capire che si è utilizzata una tabella di entries su 12 bit. Lo spazio di archiviazione su un disco, e nei dispositivi di archiviazione di grandi dimensioni, ad esempio, è suddiviso in unità denominate settori, un gruppo di settori poi forma un cluster. Poiché un file system di questo tipo era tipicamente utilizzato nei floppy disk, il numero di settori in un cluster era stato fissato a uno. In questo modo, la dimensione di un settore (e quindi di un cluster) è di 512 byte. All’interno dei file system di tipo FAT possiamo, per l’appunto, includere diverse tipologie correlate. Infatti, ci sono tre differenti proposte in base alle dimensioni della tabella. È l’utilità di sistema, ad esempio in ambito Windows o attraverso delle interfacce dedicate per mezzo di una libreria, che consente di partizionare il disco e di scegliere il tipo corretto di FAT per il volume che si sta utilizzando. È bene ricordare che la dimensione della FAT rappresenta un fattore limitante perché è in questa struttura che troviamo il numero dei cluster e le informazioni su come comporre un file presente in memoria attraverso i settori. In effetti, se provassimo a riassumere le caratteristiche principali delle diverse soluzioni, quello che otteniamo è un riassunto di questo tipo:
- FAT12. È il più vecchio e utilizza un numero a 12-bit per contenere il numero dei cluster. A questo riguardo, possiamo tranquillamente affermare che un volume formattato con FAT12 può contenere un massimo di 4.086 cluster, ossia 212 meno alcuni valori riservati in FAT. FAT12 è quindi il più adatto per volumi molto piccoli, ed è utilizzato su floppy disk e partizioni aventi una dimensione inferiori a 16 MB (cosa rara oggi a meno di considerare sistemi embedded di piccole dimensioni).
- FAT16. È la soluzione utilizzata nella maggior parte dei sistemi più datati e, per le piccole partizioni, anche su sistemi moderni: questa FAT utilizza un numero a 16 bit per registrare i cluster. Quando si vede fare riferimento a un volume di tipo “FAT” genericamente, di solito ci si riferisce alla FAT16, perché è lo standard “de facto” per i dischi rigidi, anche se comunque oggi la FAT32 è quella più popolare. Un volume che utilizza una tabella formattata come FAT16 può contenere un massimo di 65.526 cluster, ossia 216 meno alcuni valori riservati. Una tabella di questo tipo è utilizzata per i volumi con una dimensione variabile da 16 Mb a 2.048 Mb. La VFAT è poi una variante di una FAT16.
- L’ultima soluzione che consideriamo, la FAT32, è supportata da diverse versioni, ad esempio quelle di Windows, tra cui OEM SR2 rilascio di Windows 95, così come Windows 98, Windows ME e Windows 2000. Questa variante utilizza un numero di cluster binario da 28-bit, non 32, perché 4 dei 32 bit sono “riservati”.
Un valore di 28 bit è sufficiente per permettere volumi di una certa consistenza; infatti, la FAT32 è, in linea teorica, in grado di gestire volumi con oltre 268 milioni di cluster con una dimensione del disco, o della memoria da gestire, fino a 2Tb, anche se con diverse limitazioni. A questo riguardo nella Tabella 2 si mettono in evidenza tali differenze.
UN FILE SYSTEM SU FAT12
Il layout della memoria utilizzata in ambito di una FAT12 può essere visto come diviso in quattro sezioni principali, più specificatamente chiamate come boot sector, FAT tables, root directory e data area (a questo riguardo la Figura 1 ci aiuta a “vedere” questa divisione).
La sezione di boot comprende il settore 0, o primo settore, presente sul volume o disco (o in memoria per i sistemi embedded). Questo particolare settore contiene tutte le informazioni che sono specifiche e che aiutano a definire e organizzare il file system, si veda la Tabella 3. Ad esempio, in questo settore si trovano le informazioni sull’eventuale presenza di differenti copie di FAT o le info sulla grandezza di un settore e, ancora, sulla presenza dei settori per cluster. La sezione chiamata FAT tables, vedi sempre la Figura 1, contiene poi i riferimenti a ogni cluster presenti sul disco, o memoria, attraverso una lista concatenata: è così possibile individuare ciascun cluster senza particolari problemi. Non solo, attraverso questa catena è possibile individuare l’ultimo cluster e, sempre verificando le informazioni all’interno di ciascun cluster, si può scoprire se un particolare cluster è vuoto o se sono presenti degli errori. Per inciso, le tabelle FAT possono rappresentare l’unico metodo per trovare la posizione di file e directory sul resto del disco. Non solo, ci sono in genere, per motivi di sicurezza e di recupero dei dati, due copie ridondanti della tabella FAT. Si ricorda che, nel caso di un floppy, un cluster è costituito da un solo settore, insieme ad un puntatore in ogni settore del disco. Il terzo settore è la cosiddetta root directory e può essere vista come il folder principale del disco, o file system. A differenza di altri folder situati nell’area dati del disco, la root directory ha una dimensione finita (per FAT12, 14 settori *16 voci di directory per settore = 224 possibili voci), che limitano la quantità totale di file o directory che possono essere creati nel file system. A questo punto non ci rimane che la Data Area, cioè l’area che contiene i dati dei file e delle directory. A questo riguardo la Tabella 1 pone in evidenza l’organizzazione del file system.
Dalla tabella notiamo che il boot sector è presente al settore 0 e contiene informazioni sulla geometria del disco, in altre parole l’insieme delle informazioni necessarie al sistema operativo al fine di utilizzare il disco in modo corretto. Ogni volta che si usa il disco, le informazioni dal settore di avvio vengono lette. Il settore d’avvio su un floppy formattato DOS è una sequenza di byte così come riportato in Tabella 2.
La sezione FAT del disco, sempre riferendosi alla tabella, è una struttura dati, così come posto in evidenza in precedenza, che mappa i settori del dispositivo di memorizzazione. Possiamo dire che questa struttura è simile ad una matrice dove ciascuna voce corrisponde ad un cluster di dati sul disco. I valori di interesse in ogni voce della FAT possono essere riassunti in questo modo:
- Un valore per indicare l’ultimo cluster di un file
- Un valore per indicare che l’insieme dei dati non è al momento utilizzato
- Un valore per indicare il cluster successivo al file corrente
In particolare, i valori d’ingresso FAT hanno il seguente significato:
- Con valore pari a 0x00, la sua entry non è utilizzata
- Con un valore compreso tra 0xFF0-0xFF6, si identifica un cluster riservato
- Un valore pari a 0xFF7 ci aiuta a indentificare un cluster danneggiato (bad cluster)
- Un valore compreso tra 0xFF8 e 0xFFF, ci permette di identificare, al contrario, l’ultimo cluster di un file
- Con un valore che non rientra tra quelli sopra esplicitati, identifica il numero del cluster successivo in un file.
Altro aspetto da non sottovalutare è la traduzione di un settore fisico a uno logico. Un sistema FAT ha la necessità di riferirsi a settori fisici che, attraverso opportuni meccanismi di traduzione, permettono di identificare un file presente sul disco. Per un sistema FAT12 è necessario tenere presente almeno due punti. Per prima cosa, tenendo conto dell’organizzazione del disco, i primi 33 settori sono predefiniti: il settore dati effettivi, dati utente, non è presente in questi primi 33. Non solo, le voci nelle posizioni 0 e 1 della FAT sono riservate. Pertanto, l’ingresso 2 della FAT in realtà contiene la descrizione del settore fisico 33. Pertanto, il settore fisico è identificato come:
numero del settore = 33 + voce FAT - 2
ad esempio, all’ingresso 5 della FAT è necessario fare riferimento al numero del settore fisico 36. Le cartelle, o folder così come la root directory, occupano uno o più settori. Ogni settore (512 byte) di una cartella contiene 16 voci, o attributi di ciascuna cartella, con una lunghezza non superiore a 32 byte. Ogni voce descrive e punta o a un file o ad una particolare sottodirectory presente sul disco. Così, ogni cartella deve contenere una raccolta di riferimenti che consentono di specificare i file e le sottocartelle di quella particolare cartella. Ogni elemento, così, contiene le seguenti informazioni sul file o sottodirectory cui si punta: nome file, estensione, attributo (Read-only, Hidden, System, Volume label, Subdirectory, Archive), tempo e data di creazione, ultimo accesso al file, tempo e data dell’ultima scrittura, primo cluster logico e dimensione del file. Queste voci sono tra loro distanziate secondo quanto riportato in Tabella 4.
C’è un’altra considerazione da fare. Questo formato è stato, fin dall’inizio, utilizzato in sistemi DOS con il limite sui nomi dei file. Infatti, in DOS i nomi dei file hanno un limite massimo di 8 caratteri e 3 caratteri per l’estensione. In questo caso occorre tenere presente almeno due accorgimenti. Per prima cosa i nomi dei file con le estensioni non sono “null-terminated” all’interno della voce di directory e, in seconda battuta, i nomi delle directory/file occupano sempre otto byte. Alla presenza di nomi più corti, questi vengono integrati (padded) con spazi (ASCII 32, o esadecimale 0x20). Questo accorgimento vale anche per le estensioni di 3 caratteri. I nomi dei file, con le relative estensioni, sono sempre scritti in maiuscolo. In questo caso il driver software si preoccupa di convertire i nomi in maiuscolo. Non solo, “FILE1” e “FILE1.TXT” sono uniche (l’estensione non importa), i file e le directory non possono avere lo stesso nome (anche se alla presenza di attributi differenti). Eccovi alcuni esempi di conversione: da “foo.bar” in “FOO BAR”, da “FOO.BAR” a “FOO BAR”, da “Foo.Bar” a “FOO BAR”, da “foo” a “FOO “, da “foo.” a “FOO “, da “PICKLE.A” a “PICKLE A “ e, infine, da “prettybg. big” a “PRETTYBGBIG”. Il primo carattere di un nome di file o cartella non può essere un punto; infatti, il nome “.big” è considerato illegale.
RENESAS
La TFAT library di Renesas richiede uno spazio minimo di memoria; infatti, secondo quanto riportato dal documento [1], per utilizzare correttamente il software bisogna verificare se sono disponibili almeno, 8,4 kb di ROM e 6 byte di RAM. Esistono, poi, alcune limitazioni, anche se per il mondo embedded possono avere una rilevanza inferiore; infatti, la libreria non permette di utilizzare nomi di file aventi una dimensione maggiore della FAT12: il costruttore garantisce il supporto nella forma 8.3 e non consente dimensioni maggiori. Nella Figura 2 possiamo notare la stratificazione software utilizzata da Renesas, mentre in Figura 3 si mostrano i limiti di memoria di ciascuna funzione presente in libreria.
Il prodotto di Renesas garantisce buone prestazioni temporali; infatti, per scrivere un file con una dimensione pari a 1 Mb in memoria, questo stack software impiega circa 4 secondi: un tempo comprensivo delle operazioni di apertura del file, scrittura e chiusura. Al contrario, per leggere lo stesso file il tempo speso è di circa 3 secondi. Questi valori sono stati ricavati utilizzando una memoria Transcend MMC 256 Mb con una FAT32 e un clock di CPU pari a 200 MHz (peripheral clock di 50 MHz).