close

GRASSO

Vai alla navigazione Vai alla ricerca

FAT ( English  File Allocation Table "file allocation table") è un'architettura di file system classica , che, per la sua semplicità, è ancora ampiamente utilizzata per le unità flash . Utilizzato in floppy disk , schede di memoria e altri supporti di memorizzazione. In precedenza, veniva utilizzato anche sui dischi rigidi.

Sviluppato da Bill Gates e Mark McDonald ( inglese ) nel 1976-1977 [1] [2] . È stato utilizzato come file system principale nei sistemi operativi delle famiglie MS-DOS e Windows 9x .

La struttura FAT segue lo standard ECMA-107 ed è definita in dettaglio dalla specifica ufficiale Microsoft nota come FATGEN [3] .

Versioni del sistema FAT

Esistono quattro versioni di FAT- FAT12 , FAT16 , FAT32 ed exFAT (FAT64) . Differiscono per il bit dei record nella struttura del disco, ovvero il numero di bit riservati per la memorizzazione del numero del cluster. FAT12 viene utilizzato principalmente per i floppy disk , FAT16 per i dischi di piccole dimensioni. Basato su FAT, è stato sviluppato un nuovo file system exFAT (extended FAT), utilizzato principalmente per le unità flash .

Inizialmente, FAT non supportava un sistema di directory gerarchico: tutti i file si trovavano nella radice del disco. Ciò è stato fatto per semplicità, poiché sui floppy disk a lato singolo con una capacità di soli 160–180 KB, semplicemente non aveva senso ordinare alcuni file in directory. Con la diffusione di dischetti di 320 o più kilobyte, la memorizzazione di tutti i file nella radice si è rivelata scomoda, inoltre, le dimensioni ridotte della directory principale limitavano il numero di file sul disco. Le directory sono state introdotte con il rilascio di MS-DOS 2.0.

Diversi sistemi operativi hanno anche implementato varie estensioni FAT. Ad esempio, DR-DOS ha attributi di accesso ai file aggiuntivi; in Windows 95 , Linux  - supporto per nomi di file lunghi (LFN) in formato Unicode (Virtual FAT - VFAT); su OS/2  , attributi estesi di tutti i file.

VFAT

VFAT  è un'estensione FAT introdotta in Windows 95 . In FAT, i nomi dei file sono in formato 8.3 e sono costituiti solo da caratteri ASCII . Il supporto per nomi di file lunghi (fino a 255 caratteri) ( Long File Name, LFN ) nella codifica UTF-16LE è stato aggiunto a VFAT ,  mentre gli LFN vengono memorizzati contemporaneamente ai nomi in formato 8.3, chiamato retrospettivamente SFN ( English Short File Name ). Gli LFN non fanno distinzione tra maiuscole e minuscole durante la ricerca, tuttavia, a differenza degli SFN, che sono memorizzati in maiuscolo, gli LFN conservano le maiuscole specificate al momento della creazione del file [4] [5] .  

Struttura del sistema FAT

Nel file system FAT, i settori del disco contigui sono combinati in unità chiamate cluster . Il numero di settori in un cluster è pari a una potenza di due (vedi sotto). Viene allocato un numero intero di cluster (almeno uno) per la memorizzazione dei dati dei file, quindi, ad esempio, se la dimensione del file è 40 byte e la dimensione del cluster è 4 KB, solo l'1% dello spazio allocato sarà effettivamente occupato dalle informazioni sul file. Per evitare tali situazioni, è consigliabile ridurre le dimensioni dei cluster e viceversa ridurre la quantità di informazioni sull'indirizzo e aumentare la velocità delle operazioni sui file. In pratica si sceglie qualche compromesso. Poiché la capacità del disco potrebbe non essere espressa in un numero intero di cluster, di solito alla fine del volume ci sono i cosiddetti settori in eccesso, un "resto" di dimensioni inferiori a un cluster, che non può essere allocato dal sistema operativo per memorizzazione delle informazioni.

Lo spazio volumetrico FAT32 è logicamente suddiviso in tre aree contigue:

  • area riservata. Contiene strutture di servizio che appartengono al record di avvio della partizione (Partition Boot Record - PBR, per distinguerlo dal Master Boot Record  - il record di avvio principale del disco; PBR è anche spesso erroneamente chiamato settore di avvio) e vengono utilizzate durante l'inizializzazione del volume;
  • Un'area di una tabella FAT contenente una matrice di puntatori all'indice ("celle") corrispondenti ai cluster dell'area dati. Per aumentare l'affidabilità, sul disco vengono solitamente presentate due copie della tabella FAT;
  • L'area dati in cui viene registrato il contenuto effettivo dei file, ovvero il testo dei file di testo, l'immagine codificata per i file di immagine, il suono digitalizzato per i file audio, ecc.

FAT12 e FAT16 hanno anche un'area dedicata per la directory principale. Ha una posizione fissa (subito dopo l'ultimo elemento della tabella FAT) e una dimensione fissa in elementi a 32 byte, ovvero quando si descrive nel Partition Boot Record è proprio il numero di elementi a 32 byte che viene indicato , ognuno dei quali descrive qualsiasi elemento della directory principale (che si tratti di un file o di un'altra sottodirectory).

Se un cluster appartiene a un file, la cella corrispondente nella tabella FAT contiene il numero del cluster successivo dello stesso file. Se la cella corrisponde all'ultimo cluster del file, contiene un valore speciale (0xFFFF per FAT16). Pertanto, viene creata una catena di cluster di file. Gli zeri corrispondono ai cluster inutilizzati nella tabella. I cluster "cattivi" (che sono esclusi dall'elaborazione, ad esempio, perché l'area corrispondente del dispositivo è illeggibile) hanno anche un codice speciale (0xFFF7 per FAT16).

Quando un file viene eliminato, il primo carattere del nome viene sostituito con il codice speciale 0xE5 e la catena di cluster del file nella tabella di allocazione viene reimpostata su zero. Poiché le informazioni sulla dimensione del file (che si trova nella directory accanto al nome del file) rimangono intatte, se i cluster di file si trovavano in sequenza sul disco e non sono stati sovrascritti con nuove informazioni, è possibile ripristinare il file eliminato.

Record di avvio

La prima struttura di un volume FAT si chiama BPB ( BIOS  parameter block ) e si trova in un'area riservata, nel settore zero. Questa struttura contiene informazioni che identificano il tipo di file system e le caratteristiche fisiche del supporto (disco floppy o partizione del disco rigido).

Blocco parametri BIOS (BPB)

BPB era assente da FAT, che serviva MS-DOS 1.x, poiché a quel tempo si presumevano solo due diversi tipi di volumi: floppy disk da 320 KB da cinque pollici a lato singolo e doppio e il formato del volume era determinato da il primo byte dell'area FAT. BPB è stato introdotto in MS-DOS 2.x all'inizio del 1983 come struttura del settore di avvio obbligatoria da cui determinare il formato del volume d'ora in poi; il vecchio schema di rilevamento del primo byte FAT non era più supportato. Anche in MS-DOS 2.0 è stata introdotta una gerarchia di file e cartelle (prima tutti i file erano archiviati nella directory principale).

La struttura BPB in MS-DOS 2.x conteneva un campo "numero totale di settori" a 16 bit, il che significava che questa versione di FAT era fondamentalmente inapplicabile per volumi maggiori di 2 16 = 65.536 settori, ovvero più di 32 MB con una dimensione del settore standard di 512 byte. In MS-DOS 4.0 (1988), il campo BPB è stato ampliato a 32 bit, il che significava un aumento della dimensione del volume teorico a 232 = 4.294.967.296 settori, ovvero fino a 2 TB con un settore di 512 byte.

La successiva modifica di BPB è apparsa con Windows 95 OSR2, che ha introdotto FAT32 (nell'agosto 1996). Il limite di 2 TB sulla dimensione del volume è stato rimosso, un volume FAT32 può teoricamente avere una dimensione massima di 8 TB. Tuttavia, la dimensione di ogni singolo file non può superare i 4 GB. Il BIOS Parameter Block in FAT32, per compatibilità con le versioni precedenti di FAT, ripete il BPB di FAT16 fino al campo BPB_TotSec32 incluso, seguito dalle differenze.

Il "settore di avvio" FAT32 è in realtà tre settori da 512 byte - settori 0, 1 e 2. Ciascuno di essi contiene la firma 0xAA55 all'indirizzo 0x1FE, cioè negli ultimi due byte, se la dimensione del settore è 512 byte. Se la dimensione del settore è superiore a 512 byte, la firma è contenuta sia all'indirizzo 0x1FE che negli ultimi due byte del settore zero, ovvero è duplicata.

FSInfo

Il record di avvio di una partizione FAT32 contiene una struttura denominata FSInfo che viene utilizzata per memorizzare il valore del conteggio cluster libero del volume. FSInfo, di regola, occupa il settore 1 (vedi campo BPB_FSInfo) ed ha la seguente struttura (indirizzi relativi all'inizio del settore):

  • FSI_LeadSig. La firma a 4 byte 0x41615252 indica che il settore viene utilizzato per la struttura FSInfo.
  • FSI_Riservato1. L'intervallo da 4 a 483 byte del settore, compreso, viene azzerato.
  • FSI_StrucSig. Un'altra firma si trova in 0x1E4 e contiene il valore 0x61417272.
  • FSI_Free_count. Il campo a 4 byte all'indirizzo 0x1E8 contiene l'ultimo numero di cluster liberi sul volume noto al sistema. Il valore 0xFFFFFFFF significa che il numero di cluster liberi è sconosciuto e deve essere calcolato.
  • FSI_Nxt_Libero. Il campo a 4 byte all'indirizzo 0x1EC contiene il numero del cluster da cui dovrebbe iniziare la ricerca dei cluster liberi nella tabella del puntatore dell'indice. Di solito questo campo contiene il numero dell'ultimo cluster FAT allocato per l'archiviazione dei file. Il valore 0xFFFFFFFF significa che la ricerca di un cluster libero deve essere eseguita dall'inizio della tabella FAT, ovvero dal secondo cluster.
  • FSI_Riservato2. Campo riservato a 12 byte all'indirizzo 0x1F0.
  • FSI_TrailSig. La firma 0xAA550000 sono gli ultimi 4 byte del settore FSInfo.

Lo scopo dell'introduzione di FSInfo è ottimizzare il funzionamento del sistema, poiché in FAT32 la tabella dei puntatori dell'indice può essere molto grande e la sua ricerca byte per byte può richiedere molto tempo. Tuttavia, i valori dei campi FSI_Free_Count e FSI_Nxt_Free potrebbero non corrispondere alla realtà e dovrebbero essere verificati per l'adeguatezza. Inoltre, non vengono nemmeno aggiornati nel backup di FSInfo, che di solito si trova nel settore 7.

Determinazione del tipo di volume FAT

La determinazione del tipo FAT di un volume (ovvero la scelta tra FAT12, FAT16 e FAT32) viene effettuata dal sistema operativo in base al numero di cluster nel volume, che, a sua volta, è determinato dai campi BPB. Innanzitutto viene calcolato il numero di settori della directory principale:

RootDirSectors = (BPB_RootEntCnt * 32) / BPB_BytsPerSec

Successivamente, viene determinato quale dei campi BPB_FATSz16/32 e BPB_TotSec16/32 non è uguale a zero e vengono utilizzati per determinare il numero di settori dell'area dati del volume:

DataSec = TotSec - (BPB_ResvdSecCnt + (BPB_NumFATs * FATSz) + RootDirSectors)

Infine, viene determinato il numero di cluster di area dati:

Conteggiodicluster = DataSec / BPB_SecPerClus

Per il numero di cluster, c'è una corrispondenza uno a uno con il file system:

  • Conteggio di cluster < 4085 - FAT12
  • Conteggiodicluster = 4085 ÷ 65524 - FAT16
  • Conteggio di cluster > 65524 - FAT32

Secondo la specifica ufficiale, questo è l'unico modo valido per determinare il tipo di FAT. La creazione artificiale di un volume che viola le regole di mappatura specificate ne causerà la gestione non corretta da parte di Windows. Tuttavia, si consiglia di evitare valori di CountofClusters vicini ai valori critici (4085 e 65525) al fine di determinare correttamente il tipo di file system da qualsiasi driver, spesso scritto in modo errato.

FAT12 viene sempre creato su un floppy quando formattato . Per quanto riguarda i dischi rigidi e le unità flash , quindi con una dimensione dell'unità fino a 512 MB (con un settore da 512 byte), viene creato di default FAT16, oltre 512 MB - FAT32. La dimensione del cluster viene determinata durante la formattazione in base al file system e alla dimensione del volume.

Numero di serie del volume

Il numero di serie del volume (il campo BS_VolID) in Windows 98 viene creato dal formato data e ora in modo tale che sia impossibile ripristinarli senza ulteriori informazioni.

Tabella FAT

La successiva struttura importante di un volume FAT è la tabella FAT stessa, che occupa un'area logica separata. Definisce un elenco (catena) di cluster che ospitano i file e le cartelle del volume. Esiste una corrispondenza uno a uno tra i cluster e i puntatori all'indice della tabella: l'ennesimo puntatore corrisponde al cluster con lo stesso numero. Al primo cluster dell'area dati viene assegnato il numero 2. Il valore del puntatore dell'indice corrisponde allo stato del cluster corrispondente. Sono possibili i seguenti stati:

  • il cluster è libero — il puntatore è azzerato;
  • il cluster è occupato da un file e non è l'ultimo cluster di file: il puntatore contiene il numero del cluster di file successivo;
  • il cluster è l'ultimo cluster del file — il puntatore contiene l'etichetta EOC (End Of Clusterchain), il cui valore dipende dalla versione FAT: per FAT12, l'etichetta EOC è qualsiasi valore maggiore o uguale a 0x0FF8 (0x0FFF per predefinito); per FAT16 — maggiore o uguale a 0xFFFF8 (predefinito 0xFFFF); per FAT32, qualsiasi valore maggiore o uguale a 0x0FFFFFF8 (0x0FFFFFFFF per impostazione predefinita);
  • il cluster è danneggiato — il puntatore contiene un'etichetta speciale, il cui valore è 0x0FF7 per FAT12, 0xFFF7 per FAT16 e 0x0FFFFFF7 per FAT32. Un cluster danneggiato non può essere utilizzato dal file system per l'archiviazione dei dati; i puntatori corrispondenti non sono interessati durante la formattazione del volume, quando tutti gli altri puntatori sono impostati a zero;
  • il cluster è riservato "per la standardizzazione futura" - il puntatore contiene un valore maggiore di CountofClusters, ma inferiore all'etichetta del cluster danneggiato (ovvero, fino a 0xFFF6 per FAT16 incluso). In questo caso il cluster, non corrispondente ad alcun dato reale, viene considerato occupato e viene saltato alla ricerca di uno libero, ma non vengono fornite altre informazioni a riguardo.

I cluster 0 e 1 sono riflessi separatamente da FAT. Il puntatore dell'indice corrispondente al cluster zero (il primo puntatore della tabella FAT) contiene il valore di BPB_Media negli 8 bit inferiori; i bit rimanenti sono impostati su 1. Ad esempio, se BPB_Media = 0xF8 (disco rigido), FAT[0] = 0x0FFFFFF8 per FAT32. Quindi, formalmente FAT[0] = EOC, che viene utilizzato durante l'elaborazione di file di dimensioni zero (vedi sotto).

Il secondo puntatore riservato, FAT[1], viene impostato sul valore del contrassegno EOC durante la formattazione. In FAT12, non viene più utilizzato in alcun modo, e in FAT16 e FAT32, i due bit superiori di questo puntatore possono contenere un segno sulla necessità di controllare il volume (il cosiddetto " bit sporco ") e tutti gli altri i bit sono impostati su 1. La presenza di un bit sporco viene verificata durante il processo di avvio di Windows del programma autochk.exe. Il bit sporco viene generato quando il volume non viene smontato correttamente o quando il supporto presenta un errore hardware e, di conseguenza, assume due valori possibili.

Un puntatore di indice FAT32 è per definizione 32 bit, ma i primi 4 bit vengono effettivamente ignorati, quindi il valore del puntatore è, in effetti, 28 bit. L'unica operazione che opera sui primi 4 bit del puntatore è la formattazione del volume, che reimposta l'intero puntatore. Ciò significa che, ad esempio, i valori del puntatore 0x10000000, 0xF0000000 e 0x00000000 corrispondono tutti a un cluster libero, poiché differiscono solo nei primi 4 bit.

Il valore della dimensione della tabella FAT BPB, ovvero BPB_FATSz16/32, può essere maggiore di quello reale, per cui possono esserci settori alla fine di ogni tabella FAT che non corrispondono ad alcun cluster di dati reale. Durante la formattazione, questi settori vengono azzerati e durante il funzionamento del volume non vengono utilizzati in alcun modo. Pertanto, l'indirizzo effettivo dell'ultimo settore della tabella FAT, che contiene i puntatori a cluster di volume reale, deve sempre essere calcolato dal numero totale di cluster di area dati e non dal campo BPB_FATSz16/32. Inoltre, l'ultimo settore occupato dalla tabella FAT non ne è necessariamente occupato completamente: in questo caso, anche lo spazio in eccesso del settore non viene utilizzato e viene riempito di zeri durante la formattazione del volume.

Record di file

Immediatamente dopo la fine dell'ultima tabella FAT c'è un'area dati contenente file e cartelle. Una directory FAT è un file normale contrassegnato da un attributo speciale. I dati (contenuti) di tale file in qualsiasi versione FAT sono una catena di record di file a 32 byte (record di directory). Normalmente una directory non può contenere due file con lo stesso nome. Se il programma di controllo del disco trova una coppia creata artificialmente di file con lo stesso nome nella stessa directory, uno di essi viene rinominato.

Directory principale

L'unica directory che deve essere presente è la directory principale. In FAT12/FAT16, la directory principale ha una dimensione fissa in settori, che viene calcolata dal valore di BPB_RootEntCnt e segue la tabella FAT su disco.

In FAT32, la directory principale, come qualsiasi altra, ha una dimensione variabile ed è una catena di cluster. Il numero del primo cluster di directory radice viene riflesso da BPB_RootClus. La directory principale differisce dalle altre directory su un volume FAT nei seguenti modi:

  • non ha data e ora;
  • nessun proprio nome (tranne "\");
  • non contiene file denominati "." e ".." (vedi sotto);
  • è l'unica directory che normalmente può contenere un file di etichetta del volume (vedi sotto).

Struttura di un record di file

Image
Posizione dei campi del record di file

Un record di file FAT32 è costituito dalle seguenti strutture:

  • DIR_Nome. Il campo di 11 byte all'indirizzo relativo 0 contiene il nome del file breve (secondo lo standard 8.3). Vedi sotto per i nomi dei file.
  • DIR_Attr. Byte all'indirizzo 0x0B, responsabile degli attributi del file.
  • DIR_NTRes. Byte all'indirizzo 0x0C, utilizzato in Windows NT.
  • DIR_CrtTimeDecimo. Byte all'indirizzo 0x0D. Conteggio di decine di millisecondi di tempo di creazione del file, i valori validi sono 0–199. Il campo viene spesso ignorato inutilmente.
  • DIR_CrtTime. 2 byte all'indirizzo 0x0E. Tempo di creazione del file preciso fino a 2 secondi.
  • DIR_CrtDate. 2 byte all'indirizzo 0x10. La data di creazione del file.
  • DIR_LstAccDate. 2 byte all'indirizzo 0x12. La data dell'ultimo accesso al file (ovvero l'ultima lettura o scrittura, in quest'ultimo caso è uguale a DIR_WrtDate). Non esiste un campo simile per il tempo.
  • DIR_FstClusHI. 2 byte all'indirizzo 0x14. Il primo numero di cluster del file (parola alta, zero su un volume FAT12/FAT16).
  • DIR_WrtTime. 2 byte all'indirizzo 0x16. Ora dell'ultima registrazione (modifica) del file, ad esempio la sua creazione.
  • DIR_WrtDate. 2 byte all'indirizzo 0x18. La data dell'ultima registrazione (modifica) del file, inclusa la creazione.
  • DIR_FstClusLO. 2 byte all'indirizzo 0x1A. Numero del primo cluster del file (low word).
  • DIR_FileSize. DWORD contenente il valore della dimensione del file in byte. La limitazione fondamentale di FAT32 è che la dimensione massima consentita del file è 0xFFFFFFFF (ovvero 4 GB meno 1 byte).

Se il primo byte di una voce FAT (ovvero, DIR_Name[0]) contiene 0xE5 o 0x05, significa che la voce è libera (il file corrispondente è stato eliminato). Zero in DIR_Name[0] significa che non solo questa voce è libera, ma anche tutte le successive voci di directory; Windows non analizza il resto di una directory dopo una voce azzerata.

Nome del file in FAT

Il campo DIR_Name è suddiviso logicamente nei primi 8 caratteri, che formano il nome del file, e gli ultimi 3, che formano l'estensione. Il punto separatore viene aggiunto a livello di sistema operativo e non viene memorizzato nel campo del nome. Se il nome del file e l'estensione non riempiono lo spazio loro assegnato, i byte rimanenti del campo DIR_Name vengono riempiti con spazi (0x20). Il nome e l'estensione del file possono contenere qualsiasi combinazione di lettere, numeri o caratteri con codici ASCII maggiori di 127; i caratteri speciali sono divisi in tre gruppi:

  • Consentito: ! # $ % & () - @ ^ _ ` { } ~ '
  • Vietato: +.; =[]
  • Servizio: * ? <: > / \ | "

I caratteri di servizio hanno un significato speciale in DOS e Windows e non possono far parte del nome di un file (i segni * ? sono metacaratteri e i segni: /\ sono usati come separatori nei percorsi dei file , altri caratteri di servizio e illegali sono caratteri di controllo negli interpreti della riga di comando COMMAND.COM e cmd.exe ), mentre i caratteri proibiti possono ancora essere inclusi nel nome del file al costo di una voce LFN (vedi sotto). Ad esempio, una directory con un nome che inizia con un punto o che contiene più punti può essere creata in modalità riga di comando ( mkdir .directory) o in shell come FAR Manager , Total Commander , WinRAR . Il nome del file non può iniziare o terminare con uno spazio; nessun carattere di controllo ASCII (ovvero 0x00-0x1F) è consentito in nessun byte del campo del nome, ad eccezione del caso del codice 5 sopra specificato.Le informazioni sulla codepage DOS corrente (al momento della creazione del file) non sono salvato, quindi l'accesso a file i cui nomi contengono codici nazionali da Extended ASCII (ad esempio caratteri cirillici da codepage 866 ), con una codepage diversa, potrebbe essere problematico o impossibile (perché prima di cercare un file nella directory, il suo nome viene convertito in maiuscolo secondo la tabella riportata nella tabella codici). Il percorso completo del file non può superare gli 80 byte (3 è la lettera dell'unità; 64 è il percorso; 12 è il nome del file, incluso il punto delimitatore; 1 è il carattere nullo del terminale).

Tutti gli 8.3 caratteri alfabetici del nome vengono sempre tradotti e memorizzati nel campo DIR_Name in maiuscolo. Il byte DIR_NTRes viene utilizzato per preservare il caso originale di un nome di Windows NT : un 1 nel bit 3 indica che il nome deve essere visualizzato in minuscolo; responsabile dell'estensione è il bit 4. Se il nome o l'estensione contiene caratteri di entrambi i casi, viene creato un record LFN per tale file (vedi sotto). Windows 9x crea sempre una voce LFN per preservare il caso non banale del nome e ignora il campo DIR_NTRes. Di conseguenza, il nome dello stesso file, privo di una voce LFN associata, può essere visualizzato da Windows 9x interamente in maiuscolo, ma Windows NT (in parte) in minuscolo.

Attributi del file

Nel byte dell'attributo, i primi due bit sono riservati e devono essere sempre impostati a zero. I bit rimanenti sono distribuiti in modo tale che il valore 0x01 corrisponda all'attributo "sola lettura", 0x02 - "nascosto", 0x04 - "sistema", 0x20 - "archiviato". Un insieme di più attributi è costituito dalla somma dei valori di base. Oltre a questi attributi standard, vengono utilizzati i seguenti: 0x10 - indica che il file è una directory (contenitore per altri file); 0x08 - ATTR_VOLUME_ID, un attributo speciale di un file univoco di dimensione zero nella directory principale, il cui nome è considerato un'etichetta di volume. Il limite dell'etichetta del volume FAT di 11 caratteri è correlato alla dimensione del campo DIR_Name. Se il file ha READ_ONLY | NASCOSTO | SISTEMA | VOLUME_ID (valore 0x0F), indica che la voce non corrisponde a un file separato, ma contiene parte del nome lungo di un altro file che non rientra nel framework 8.3 (vedi sotto).

Un'assegnazione artificiale di un valore diverso da zero ai due bit superiori di DIR_Attr viene utilizzata per formare file che non possono essere eliminati o rinominati con i mezzi standard del file system senza formattazione. Ciò è utile, ad esempio, quando si combattono i virus Autorun.inf (Programma Panda USB e AutoRun Vaccine). D'altra parte, i virus stessi possono utilizzare lo stesso strumento. Il valore di DIR_Attr = 0x40 è riservato per uso interno (dispositivo).

Cosa succede quando viene creata una directory

Quando viene creata una directory, per essa viene impostato DIR_FileSize = 0. La dimensione del contenuto della directory viene determinata semplicemente seguendo le catene di cluster fino al segno di End Of Chain. La dimensione della directory stessa è limitata dal file system a 65.535 voci da 32 byte (ovvero, le voci di directory nella tabella FAT non possono superare i 2 MB). Questo limite ha lo scopo di velocizzare le operazioni sui file e consentire a varie utilità di utilizzare un intero a 16 bit (WORD) per contare il numero di voci in una directory (di conseguenza, esiste un limite teorico sul numero di file in una directory - 65.535, a condizione che tutti i nomi dei file seguano lo standard 8.3). Alla directory viene assegnato un cluster dell'area dati (a meno che non sia una directory radice FAT12/FAT16) e i campi DIR_FstClusHI / DIR_FstClusLO sono impostati sul valore di quel numero di cluster. Un'etichetta EOC viene inserita nella tabella FAT per la voce corrispondente a questo cluster e il cluster stesso viene riempito con zeri. Successivamente, vengono creati due file speciali, senza i quali la directory FAT è considerata danneggiata (le prime due voci da 32 byte nell'area dei dati del cluster): file di dimensioni zero con i nomi "." (un punto, identificatore di directory) e ".." (due punti, puntatore alla directory principale). La data e l'ora di questi file sono impostate sui valori della directory stessa al momento della creazione e non vengono aggiornate quando la directory cambia. I campi DIR_FstClusHI / DIR_FstClusLO del "." contengono il valore del numero del cluster che lo contiene, e il file ".." - il numero del primo cluster della directory contenente quello dato. Pertanto, il file "." fa riferimento alla directory stessa e il file ".." si riferisce al cluster iniziale della directory padre; se la directory padre è la directory radice, il cluster iniziale viene considerato zero.

Ora e data

Un timbro data a due byte ha il seguente formato:

  • bit 0-4 — giorno del mese, sono consentiti i valori 1-31;
  • bit 5–8 — mese dell'anno, sono consentiti i valori 1–12;
  • bit 9-15 - anno, a partire dal 1980 ("epoca MS-DOS"), sono possibili valori da 0 a 127 inclusi, ovvero 1980-2107.

Un timestamp a due byte ha il seguente formato:

  • bit 0-4 - contatore di secondi (due ciascuno), i valori validi sono 0-29, ovvero 0-58 secondi;
  • i bit 5-10 sono minuti, i valori validi sono 0-59;
  • i bit 11-15 sono ore, i valori validi sono 0-23.

Degli indicatori di data e ora, solo l'ora dell'ultima modifica (ovvero, DIR_WrtTime e DIR_WrtDate) è fondamentale, il resto potrebbe non essere supportato da molti sistemi; quando si opera su un file su un tale sistema (ad esempio, in DOS o Windows 3.1), questi campi vengono ignorati. FAT salva la data e l'ora in base al fuso orario locale; quando cambia, i segni non cambiano.

I timestamp per le directory vengono impostati al momento della creazione e non cambiano quando vengono scritti nuovi file in una directory, rinominati o allocato un nuovo cluster.

La data dell'ultimo accesso al file viene aggiornata ogni volta che vi si accede, ad esempio quando si visualizzano le proprietà del file, quando si passa a un altro volume (ma non all'interno del volume). Quando si copia un file in Windows 98, la data dell'ultimo accesso del file originale viene aggiornata, ma non in Windows XP.

La data e l'ora di modifica del file cambia ogni volta che viene scritto nuovo contenuto nell'area dati (non nel record del file). In altre parole, la data e l'ora di modifica non cambia quando gli attributi vengono modificati o il file viene rinominato. Lo spostamento o la copia di un file conserva il contrassegno di modifica originale.

La data e l'ora di creazione vengono impostate quando un record di file viene allocato per un nuovo file che prima non esisteva. In altre parole, quando un file viene rinominato o spostato, la data e l'ora di creazione non cambiano, ma una volta copiato, il nuovo file ottiene un nuovo timbro. Pertanto, quando si copia un file su Windows, potrebbe finire con una data di creazione successiva alla data di modifica.

record LFN

Image
Struttura del record LFN

I file e le directory con un nome lungo (maggiore di 8.3) vengono trattati in modo speciale dal file system FAT. La struttura di un record a 32 byte per un file con un LFN (Long File Name) è diversa da un record normale (SFN):

  • LDIR_Ord. Il primo byte di una voce viene utilizzato per numerare le voci nell'insieme.
  • LDIR_Nome1. Il campo di 10 byte all'indirizzo 0x01 contiene i primi cinque caratteri del nome del file (o meglio, la parte del suo nome che si riflette in questo record LFN).
  • LDIR_Attr. Il byte dell'attributo all'indirizzo 0x0B è 0x0F (ATTR_LONG_NAME).
  • Tipo_LDIR. Il byte all'indirizzo 0x0C è impostato su zero e indica inoltre che questa voce nella tabella FAT fa riferimento a un file con un nome lungo.
  • LDIR_Chksum. Il byte all'indirizzo 0x0D contiene il checksum SFN dell'alias di file corrispondente al set di record LFN.
  • LDIR_Nome2. Un campo di 12 byte all'indirizzo 0x0E contenente i caratteri da 6 a 11 del nome file.
  • LDIR_FstClusLO. Il campo a 2 byte all'indirizzo 0x1A non ha significato nel contesto di un record LFN ed è impostato su zero.
  • LDIR_Nome3. Un campo di 4 byte all'indirizzo 0x1C contenente il dodicesimo e il tredicesimo carattere del nome del file.

Un insieme di voci LFN in una directory FAT deve sempre essere associato a una normale voce SFN che è fisicamente preceduta su disco. Un insieme di record LFN trovati senza un record normale corrispondente è chiamato orfano e il record è considerato danneggiato; tale file è completamente invisibile nelle versioni precedenti di MS-DOS/Windows.

In una sequenza di record LFN, ognuno di essi ha il proprio numero di serie, determinato dal primo byte (LDIR_Ord). La maschera 0x40 indica che questa voce è l'ultima della riga di voci LFN che la seguono (ovvero, ad esempio, per la terza voce LFN della riga, il valore del byte LDIR_Ord sarà 0x43, per il 17° - 0x51 ). Nei record successivi, questo byte cambia da N per l'N-esimo record "lungo" nell'account dal normale corrispondente a 1 per il record più vicino al normale.

I nomi di file lunghi vengono memorizzati nella codifica Unicode ( UTF-16 ), preservando il caso dei caratteri alfabetici inseriti. Se un determinato carattere del nome OEM o Unicode non può essere convertito in un carattere della tabella codici, viene sempre visualizzato come carattere di sottolineatura "_" e il carattere effettivo memorizzato sul disco non viene modificato.

Il byte di checksum viene calcolato secondo un certo algoritmo basato sul nome 8.3 di un record regolare (per un file con un nome lungo, il "nome" di un record regolare è chiamato alias - alias) e copiato in tutti i " record ad esso corrispondenti. Se uno qualsiasi dei valori non è coerente con il nome del file (ad esempio, se il file è stato rinominato in una versione precedente di MS-DOS/Windows), si verifica un orfano.

Un alias di file SFN con un nome lungo è costituito da un corpo e, se necessario, da una "coda" digitale. Se il file ha un'estensione, i suoi primi tre caratteri vengono memorizzati nell'alias. Il nome corrispondente viene formato traducendo i caratteri del nome lungo del file nella codifica OEM, ignorando tutti gli spazi del nome lungo e sostituendo i caratteri non traducibili nell'OEM o vietati nel contesto del nome breve con un trattino basso "_". La coda della cifra "~n", dove n = 1 ÷ 999999, viene aggiunta all'alias se l'alias originariamente ottenuto era in conflitto con il nome di qualsiasi file nella stessa directory o era più lungo di quanto lo standard 8.3 definisce, o se qualsiasi carattere quando la modifica della codifica non ha trovato una controparte OEM ed è stata sostituita da un trattino basso. Pertanto, vengono formati alias come NEWFIL~1.DJV (LFN = New file for me.djvu). Lo schema di aliasing dei file è ottimizzato per la velocità ed è quindi imprevedibile nei dettagli.

Un nome file che non è un multiplo di 13 caratteri non riempie completamente i campi del nome delle voci LFN nella tabella FAT. In questo caso, il nome del file viene terminato artificialmente con un carattere NUL (0x00) e i byte in eccesso vengono ostruiti da uno (ovvero con caratteri 0xFF).

Per i nomi lunghi, la lunghezza del nome è limitata a 255 caratteri, senza contare il separatore NUL, e il percorso completo è limitato a 260 caratteri, incluso NUL. Il nome lungo consente anche l'uso di sei caratteri speciali vietati nei nomi brevi: +,; =[]

Se si tenta di creare un file o una directory su un volume FAT32 con un nome contenente tale carattere, viene generata automaticamente una voce LFN, indipendentemente dalla lunghezza del nome del file. Un processo simile si verifica durante la creazione di un file/cartella con un nome contenente caratteri non ASCII.

È possibile che il file dell'etichetta del volume non preceda fisicamente tutte le voci nel volume con nomi lunghi (quando il volume non ha un'etichetta o l'etichetta è stata assegnata dopo che è stato scritto un file con un nome lungo). Quindi l'etichetta del volume in FAT12/FAT16 non verrà visualizzata correttamente, poiché sarà presa dal record LFN più vicino (perché ha anche l'attributo VOLUME_ID), e se si tenta di modificare l'etichetta del volume, il nome del file corrispondente sarà effettivamente violato. Quando si elimina un file a cui sono associati record LFN, questi ultimi non vengono interessati e diventano orfani. Durante l'ulteriore creazione di un nuovo file, l'orfano menzionato può essere ad esso associato erroneamente se i checksum dei nomi dei vecchi e dei nuovi file corrispondono, tuttavia, all'algoritmo di calcolo del checksum utilizzato (il codice ASCII del primo carattere del file l'alias viene spostato ciclicamente di un po' a destra e viene aggiunto il codice del carattere successivo, ecc. d) rende questa probabilità trascurabile.

Significato delle operazioni sui file in FAT

Formattazione del volume  : la tabella del puntatore dell'indice viene reimpostata su zero, ad eccezione dei primi tre (FAT[0] e FAT[1], sono riservati e FAT[2] contiene una voce corrispondente al file dell'etichetta del volume o, se manca l'etichetta EOC) e le registrazioni dei grappoli danneggiati; le voci della directory principale sono impostate su zero (tranne che per il file di etichetta del volume, se presente), altrimenti l'area dei dati non viene influenzata.

Eliminazione file  : il primo carattere del record del file e tutti i record LFN associati viene sostituito dal codice 0xE5; i cluster occupati dal file sono contrassegnati come liberi nella tabella FAT, ma i cluster nell'area dati non sono interessati.

Creazione di un file o directory con il comando "Nuovo" del menu contestuale - viene creata una voce di file per un nuovo file "vuoto" con un nome predefinito (ad esempio "Nuova cartella") e una dimensione determinata dal tipo di file; il file stesso, se ha una dimensione diversa da zero (che vale per quasi tutti i file "vuoti", ad eccezione delle directory e dei documenti di testo), viene scritto nell'area dati nei cluster ad esso assegnati; la catena di cluster corrispondente viene creata nella tabella FAT. Dopo aver assegnato al file un nome valido (non quello predefinito), la voce del file originariamente creata viene contrassegnata come eliminata e ne viene creata una nuova.

Rinominare un file  : viene creata una nuova voce con un nome aggiornato; la vecchia voce viene contrassegnata come eliminata.

Salvataggio di un file dall'applicazione (non dalla riga di comando): viene creato un record contenente tutti i campi ad eccezione della dimensione e del cluster iniziale del file; dopo che il file è stato salvato, viene creato un nuovo record contenente tutti i campi e il vecchio record viene eliminato.

Copia di un file  : viene creato un record di file identico nella nuova posizione (possibilmente ad eccezione di alcuni timestamp, vedi sopra), il primo cluster libero viene allocato al file e il contenuto del file viene copiato nella nuova posizione, mentre si copia il file cluster corrente, cercando quello libero successivo e riempiendo la tabella FAT.

Spostamento di un file (tra volumi diversi): copia e quindi elimina il file dalla sua posizione originale.

Riposizionamento del file (all'interno del volume): la catena di cluster non è interessata, il record del file viene copiato invariato nella nuova directory e quindi eliminato da quella precedente.

La ricerca di un cluster libero nella tabella dei puntatori di indice per l'allocazione ad un nuovo file inizia generalmente non dall'inizio dell'area dati (ovvero dal cluster 2), ma dall'ultimo cluster allocato a qualsiasi file, il numero di che è memorizzato nella struttura FSInfo. In altre parole, se al file 1 è stato assegnato il cluster 30 e al file 2 è stato assegnato il cluster 31 e quindi il file 1 è stato eliminato, quando viene creato un nuovo file 3, molto probabilmente si troverà fisicamente a partire dal cluster 32.

Tolleranza agli errori di sistema

Poiché il sistema FAT memorizza i dati sui file e i dati sullo spazio libero su disco nella stessa tabella, l'operazione di scrittura del file, che tradizionalmente consiste in due fasi (aggiungere il blocco occupato all'elenco di quelli occupati ed eliminare lo stesso blocco dall'elenco di quelli liberi), si verifica in FAT in un'unica azione. Per questo motivo, il sistema FAT ha una tolleranza agli errori intrinseca, ovvero un guasto (ad esempio l'alimentazione) al momento di un'operazione di lettura o scrittura nella maggior parte dei casi non comporterà la distruzione del file system. Tuttavia, in questo caso, stiamo parlando dell'integrità del file system e non dei file stessi.

Caratteristiche [3]

FAT12 FAT16 FAT32
Sviluppatore Microsoft
Titolo completo Tabella di allocazione dei file
(versione a 12 bit) (versione a 16 bit) (versione a 32 bit)
Presentata 1980 ( Microsoft Disk BASIC ) Agosto 1984 ( MS-DOS 3.00, troncato)
completo - luglio 1988, MS-DOS 4.0 [6]
Agosto 1996 (Windows 95 OSR 2)
ID volume 0x01 ( MBR ) 0x04, 0x06, 0x0E (MBR) 0x0B, 0x0C (MBR)
EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 ( GPT )
strutture
Contenuto della directory Tavolo
Posizionamento dei file Elenco lineare
Blocchi cattivi Etichettatura dei cluster
Restrizioni
dimensione del file 32 MB _ 2GB _ 4 GB
Numero di cluster 4084 65 524 268 435 445 (2 28 -12)
Lunghezza del nome del file 8,3 o 255 caratteri quando si utilizza LFN
Dimensioni del volume 2 MB (512 byte per settore)

32 MB (64 KB per cluster)

2 GB
4 GB (64 KB per cluster, non supportato ovunque)
2 TB
8 TB (32 KB per settore)
Capacità
Date memorizzate Creazione, modifica, accesso
Intervallo di date 1 gennaio 1980 - 31 dicembre 2107
Informazioni aggiuntive Inizialmente non supportato
Attributi del file Sola lettura, nascosto, sistema, etichetta del volume, sottodirectory, archivio
Differenziazione dei diritti di accesso Non
Compressione trasparente Utilità standalone ( Stacker , DoubleSpace , DriveSpace )
Crittografia trasparente Utilità di terze parti o cloni DOS

Licenze

Alcuni algoritmi per lavorare con FAT e VFAT sono brevettati da Microsoft.

Negli Stati Uniti in riconsiderazione[ quando? ] si è deciso di annullare alcuni brevetti, ma poi è stato annullato.

Nell'ottobre 2006, un brevetto per VFAT rilasciato dall'Ufficio europeo dei brevetti [7] è stato annullato in Germania per ovvietà .

Nel tempo, FAT è diventato ampiamente utilizzato in vari dispositivi per la compatibilità tra DOS, Windows, OS/2, Linux. Microsoft non ha mostrato alcuna intenzione di costringerli a concedere una licenza[ chiarire ] [8] .

Nel febbraio 2009, Microsoft ha citato in giudizio TomTom , un produttore di sistemi di navigazione per auto basati su Linux , per violazione di brevetto [9] .

Secondo Jeremy Ellison[ chiarire ] L'obiettivo di Microsoft è quello di presentare a diverse aziende una scelta: stipulare un accordo di protezione dei brevetti con Microsoft (come Novell stipulato con essa nel novembre 2006), violando così la GNU GPL e rendendosi impossibile l'utilizzo di Linux , o non stipulare un siffatto accordo ed essere accusato di aver violato brevetti la cui protezione è fornita al momento della sua conclusione a condizione di non divulgazione [10] [11] .

Nel marzo 2009, TomTom ha presentato una domanda riconvenzionale per violazione di brevetto [12] .

Vedi anche

Note

  1. Copia archiviata . Estratto il 9 giugno 2009 . Archiviato dall'originale il 16 luglio 2011.
  2. ^ www.microsoft.com/mscorp/ip/tech/fathist.asp su archive.org
  3. 1 2 Microsoft Extensible Firmware Initiative FAT32 File System Specifica 1.03 (collegamento non disponibile) . Microsoft (6 dicembre 2000). — Documento in formato Microsoft Word, 268 Kb. Estratto il 5 aprile 2010. Archiviato dall'originale il 22 agosto 2011. 
  4. Che dire di VFAT? (link non disponibile) . Archivio TechNet . Microsoft (15 ottobre 1999). Estratto il 5 aprile 2010. Archiviato dall'originale il 22 agosto 2011. 
  5. Non confondere l'estensione del file system VFAT con il driver del file system con lo stesso nome, che è apparso in Windows for Workgroups 3.11 ed è progettato per elaborare le chiamate di funzione MS-DOS (INT 21h) in modalità protetta (vedere: KB126746: Windows per Cronologia versioni gruppi di lavoro (non disponibile ( collegamento ) VERSIONE 3.11 → Funzionalità non di rete Microsoft (14 novembre 2003) Estratto il 5 aprile 2010. Archiviato dall'originale il 22 agosto 2011.  )
  6. Riepilogo partizionamento MS-DOS (downlink) . microsoft.com . Estratto il 23 ottobre 2012 . Archiviato dall'originale il 23 ottobre 2012. 
  7. Il tribunale federale dei brevetti dichiara nullo il brevetto FAT di Microsoft  (inglese)  (link non disponibile) . heise in linea . Heise Zeitschriften Verlag (2 marzo 2007). Estratto il 10 marzo 2009. Archiviato dall'originale il 22 agosto 2011.
  8. ^ Brian Kahin. Microsoft gira il mondo con i brevetti FAT  (inglese)  (link non disponibile) . L'Huffington Post (10 marzo 2009). Estratto il 10 marzo 2009. Archiviato dall'originale il 22 agosto 2011.
  9. ^ Ryan Paolo. La causa Microsoft sui brevetti FAT potrebbe aprire OSS Pandora's Box  (eng.)  (link non disponibile) . Ars Tecnica . Pubblicazioni Condé Nast (25 febbraio 2009). Estratto il 9 marzo 2009. Archiviato dall'originale il 22 agosto 2011.
  10. ^ Glyn Moody. Il vero motivo della causa TomTom di Microsoft  (inglese)  (collegamento non disponibile) . mondo informatico Regno Unito . IDG (5 marzo 2009). Estratto il 9 marzo 2009. Archiviato dall'originale il 22 agosto 2011.
  11. ^ Steven J. Vaughan-Nichols. Le aziende Linux firmano i patti di protezione dei brevetti Microsoft  (eng.)  (link non disponibile) . Blog Computerworld . IDG (5 marzo 2009). Estratto il 9 marzo 2009. Archiviato dall'originale il 22 agosto 2011.
  12. ^ Erica Ogg. TomTom contrattacca Microsoft nella controversia sui brevetti  (eng.)  (link non disponibile) . CNet (19 marzo 2009). Estratto il 20 marzo 2009. Archiviato dall'originale il 22 agosto 2011.

Collegamenti