Beta [ Pagina Principale || Sommario || Redazione || Informazioni || Beta Browser ]

[Rubrica Hardware]

a cura di Fernando Carello



VFAT = Very FAT

I nomi lunghi di Windows 95: un trucco ingombrante

di Francesco Sileno

Una delle innovazioni introdotte con Windows 95 è la VFAT, ovvero la FAT che supporta i nomi lunghi, fino a 255 caratteri per nome file, inclusi spazi e alcuni caratteri estesi.

Qualcuno potrebbe pensare che questa incredibile, stupenda, rivoluzionaria, innovazione (che Windows NT, OS/2, Amiga e altri supportano già da tempo) renda di fatto impossibile la compatibilità con la vetusta FAT, invece così non è.
Riassumendo brevemente il funzionamento della FAT: questo file system usa una lista di concatenazione per sapere dove sono dislocati i vari frammenti di un file. Non necessariamente un file è memorizzato in un solo blocco, ma può essere spezzettato per riempire i vari buchi che si creano con l'uso.
Usa un indirizzamento a 16 bit (12 bit per i dischetti), limitando a 65.535 (in realtà qualcosa di meno) i settori indirizzabili. Quindi si usano i cluster, dei settori logici che racchiudono in se uno o più settori fisici dell'HD (che hanno dimensione fissa di 512 byte).
La dimensione del cluster varia pressapoco come indicato nella seguente tabella:

 Dim. Partizione          Dim. Cluster
  fino a 128 Mb             2048 byte
  fino a 256 Mb             4096 byte
  fino a 512 Mb             8192 byte
  fino a 1   Gb            16384 byte
  fino a 2   Gb            32768 byte
  e oltre non so cosa succede...

In teoria dovrebbero essere possibili anche cluster di dimensioni minori, in pratica sembra che 2048 è il minimo utilizzato. Poichè un cluster è ora la minima entità indirizzabile dal file system, significa che la sua dimensione è la minima quantità allocabile. Per esempio, prendiamo un HD da 850 MB, formattato in un'unica partizione. Questo avrà dei cluster da 16 KB, che vuol dire che anche il vostro autoexec.bat, nonostante sia di un paio di KB al massimo, occuperà comunque 16 KB. Non ci credete? Fate un CHKDSK, e annotate il valore alla dicitura 'byte disponibili su disco'. Adesso create un file di testo di 6 byte. Rieseguite CHKDSK e gioite.

Però da qualche parte, non nella FAT, devono venir memorizzate le informazioni sui file, dimensione, cluster di partenza, data, ora, attributi... a ogni directory è associata una directory entry, ed è in quest'ultima che vengono messe tutte le informazioni relative ai file e sottodirectory in essa contenuti.
A sua volta la directory entry è suddivisa in entry, con dimensione fissa di 32 byte, che vengono usati per i file, le directory e la label (ecco perchè l'etichetta di volume è al massimo lunga 11 caratteri: 8+3).

La stuttura di un entry è sifatta:

Offset Dim. Contenuto
------ ---- ----------------------------------------------------------------
            +-------------------------------+
 +0      8  |'N' 'O' 'M' 'E' 'F' 'I' 'L' 'E'|
            |---+---+---+---+---+---+---+---+
 +8      3  |'E' 'S' 'T'|               il punto non è memorizzato!
            |---+---+---+
+0bH     1  |atr|                       attributi (vedi sotto).
            |---+-------- - - ----+
+0cH    0aH |      riservati      |
            |---+---+---+ - - ----+
+16H     2  |  ora  |                   ora creazione o ultima modifica.
            |---+---|
+18H     2  | data  |                   data creazione o ultima modidica.
            |---+---|
+1aH     2  |ClstrNo|                   cluster di partenza.
            |-------+-------+
+1cH     4  |   dim. file   |           dimensione file.
            +---------------+

Attributi:

+7+6+5+4+3+2+1+0+
|   |a|d|v|s|h|r|
+-+-+-+-+-+-+-+-+ bit                                               Maschera
     | | | | | +-> 0: 1=Read Only                                     (01H)
     | | | | +---> 1: 1=File nascosto                                 (02H)
     | | | +-----> 2: 1=File di sistema                               (04H)
     | | +-------> 3: 1=Etichetta di volume                           (08H)
     | +---------> 4: 1=Sub directory                                 (10H)
     +-----------> 5: Bit di archivio (usato nei backup)              (20H)

Come esempio, ecco l'estratto di una directory entry relativa alla
directory C:\DEP\TEMP del mio HD:

00000  2E 20 20 20 | 20 20 20 20 | 20 20 20 10 | 00 00 00 00   .          .....
00010  00 00 00 00 | 00 00 23 B4 | E9 1E F9 19 | 00 00 00 00   ................
00020  2E 2E 20 20 | 20 20 20 20 | 20 20 20 10 | 00 00 00 00   ..         .....
00030  00 00 00 00 | 00 00 23 B4 | E9 1E FC 17 | 00 00 00 00   ................
00040  57 41 54 43 | 4F 4D 20 20 | 20 20 20 20 | 00 00 00 00   WATCOM      ....
00050  00 00 00 00 | 00 00 BD 85 | 48 1F 2B 0B | 02 09 00 00   ................
00060  53 43 48 45 | 44 45 20 20 | 4E 46 4F 20 | 00 00 00 00   SCHEDE  NFO ....
00070  00 00 00 00 | 00 00 39 9D | 03 1F 31 05 | E8 02 00 00   ................
00080  4D 42 53 20 | 20 20 20 20 | 42 45 54 20 | 00 00 00 00   MBS     BET ....
00090  00 00 00 00 | 00 00 60 9B | DB 1E 62 01 | 71 3C 00 00   ................
000A0  49 4E 54 45 | 52 4E 45 54 | 20 20 20 20 | 00 00 00 00   INTERNET    ....
000B0  00 00 00 00 | 00 00 28 67 | 3E 1F 19 09 | FF 01 00 00   ................
000C0  43 4F 4D 20 | 20 20 20 20 | 42 45 54 20 | 00 00 00 00   COM     BET ....
000D0  00 00 00 00 | 00 00 67 8D | 48 1F D5 11 | B4 54 00 00   ................
000E0  46 4C 4F 50 | 50 59 20 20 | 20 20 20 20 | 00 00 00 00   FLOPPY      ....
000F0  00 00 00 00 | 00 00 52 A2 | 4A 1F 0D 03 | 94 08 00 00   ................
00100  56 46 41 54 | 20 20 20 20 | 42 45 54 20 | 00 00 00 00   VFAT    BET ....
00110  00 00 00 00 | 00 00 C0 A1 | 4D 1F BA 01 | A2 0B 00 00   ................
00120  44 49 52 20 | 20 20 20 20 | 48 45 58 20 | 00 00 00 00   DIR     HEX ....
00130  00 00 00 00 | 00 00 36 A2 | 4D 1F 00 00 | 00 00 00 00   ................
00140  53 43 52 45 | 45 4E 20 20 | 54 58 54 20 | 00 00 00 00   SCREEN  TXT ....
00150  00 00 00 00 | 00 00 6A 9D | 4D 1F 00 08 | 62 17 00 00   ................
00160  41 54 54 52 | 20 20 20 20 | 54 58 54 20 | 00 00 00 00   ċTTR    TXT ....
00170  00 00 00 00 | 00 00 19 9E | 4D 1F 66 09 | 86 03 00 00   ................
00180  00 00 00 00 | 00 00 00 00 | 00 00 00 00 | 00 00 00 00   ................

Vedete, le speciali directory "." e ".." hanno una loro directory entry, mentre come ultima voce c'è un file cancellato (in origine era ATTR.TXT, il DOS mette il carattere ċ sui file cancellati).

Bene, adesso vediamo cosa succede con la VFAT. Abbiamo creato un file, in una directory vuota, chiamato "Questa sembra proprio essere una prova di Cthulhu, e ancora non siamo arrivati.txt", ed ecco cosa compariva nella directory entry:

00000  2E 20 20 20 | 20 20 20 20 | 20 20 20 10 | 00 00 00 00   .          .....
00010  00 00 00 00 | 00 00 CD 12 | 43 1F EF B8 | 00 00 00 00   ................
00020  2E 2E 20 20 | 20 20 20 20 | 20 20 20 10 | 00 00 00 00   ..         .....
00030  00 00 00 00 | 00 00 CD 12 | 43 1F 00 00 | 00 00 00 00   ................
00040  47 2E 00 74 | 00 78 00 74 | 00 00 00 0F | 00 68 FF FF   G..t.x.t.....h˙˙
00050  FF FF FF FF | FF FF FF FF | FF FF 00 00 | FF FF FF FF   ˙˙˙˙˙˙˙˙˙˙..˙˙˙˙
00060  06 69 00 61 | 00 6D 00 6F | 00 20 00 0F | 00 68 61 00   .i.a.m.o. ...ha.
00070  72 00 72 00 | 69 00 76 00 | 61 00 00 00 | 74 00 69 00   r.r.i.v.a...t.i.
00080  05 20 00 61 | 00 6E 00 63 | 00 6F 00 0F | 00 68 72 00   . .a.n.c.o...hr.
00090  61 00 20 00 | 6E 00 6F 00 | 6E 00 00 00 | 20 00 73 00   a. .n.o.n... .s.
000A0  04 64 00 69 | 00 20 00 43 | 00 74 00 0F | 00 68 68 00   .d.i. .C.t...hh.
000B0  75 00 6C 00 | 68 00 75 00 | 2C 00 00 00 | 20 00 65 00   u.l.h.u.,... .e.
000C0  03 72 00 65 | 00 20 00 75 | 00 6E 00 0F | 00 68 61 00   .r.e. .u.n...ha.
000D0  20 00 70 00 | 72 00 6F 00 | 76 00 00 00 | 61 00 20 00    .p.r.o.v...a. .
000E0  02 20 00 70 | 00 72 00 6F | 00 70 00 0F | 00 68 72 00   . .p.r.o.p...hr.
000F0  69 00 6F 00 | 20 00 65 00 | 73 00 00 00 | 73 00 65 00   i.o. .e.s...s.e.
00100  01 51 00 75 | 00 65 00 73 | 00 74 00 0F | 00 68 61 00   .Q.u.e.s.t...ha.
00110  20 00 73 00 | 65 00 6D 00 | 62 00 00 00 | 72 00 61 00    .s.e.m.b...r.a.
00120  51 55 45 53 | 54 41 7E 31 | 54 58 54 20 | 00 61 01 AC   QUESTA~1TXT ....
00130  4C 1F 4C 1F | 00 00 01 AC | 4C 1F 7D B0 | 05 00 00 00   ................
00140  00 00 00 00 | 00 00 00 00 | 00 00 00 00 | 00 00 00 00   ................
00150  00 00 00 00 | 00 00 00 00 | 00 00 00 00 | 00 00 00 00   ................
00160  00 00 00 00 | 00 00 00 00 | 00 00 00 00 | 00 00 00 00   ................
L'ultima voce, QUESTA~1.TXT, è il riferimento reale al file, e contiene il nome che mantiene la compatibilità con la vecchia FAT, tuttavia alcuni byte dei 10 riservati sono usati, probabilmente per rendere noto al S.O. che il file è dotato anche di un nome lungo.

Quest' ultimo viene memorizzato PRIMA del nome breve (abbiamo fatto altre prove), in questo caso a partire dall'offset 0x40.

Si notano subito alcune cose:

Ma tutto ciò ha degli svantaggi, anche se non immediati. Quali? Adesso vi spiego: ogni directory entry ha dimensione di un cluster, eccetto quella della root che ha dimensioni molto maggiori. Mediamente, supponiamo di lavorare con cluster da 4096 byte (corrispondenti a partizioni da 128 a 250 MByte circa). Ciò vuol dire che possiamo memorizzare 4096 / 32 = 128 file nella nostra directory. No, non cominciate a strillare che voi avete directory con 3000 file dentro, lo so... se lo spazio in una directory entry finisce, il DOS ne aggiunge un altra, usando quindi un altro cluster. La cosa simpatica è che, almeno fino al MS-DOS 6.22, se poi riducete il numero di file, le directory entry ormai vuote e quindi non più utilizzate NON vengono eliminate. Meno male che c'è Norton con il suo Speed Disk...

Adesso supponiamo che voi avete 100 file da memorizzare. Se usate il vecchio metodo 8+3, vi servirà una sola directory entry. Se vi divertite coi nomi lunghi, diciamo 100 caratteri per nome, vi serviranno

100/12 = 9 entry per ciascun file
9*100 = 900 entry totali
900/128 = 8 directory entry.

Il che vuol dire che portate via 8*4096 = 32768 byte (32 KB) per memorizzare dei nomi lunghi che in totale occupano 100*100 = 10000 byte (meno di 10 KB). Avete cioè triplicato lo spazio usato per i nomi lunghi, e non parliamo di cosa succede se usate nomi da 200 caratteri... anzi si, parliamone: vi ritrovate con 64 KB usati per memorizzare 20 KB di nomi lunghi.

Chi lavora con dei bei clusteroni da 32 KB, sarà tutto felice che può far entrare più entry in un solo cluster... se vi rende felici sapere che il vostro AUTOEXEC.BAT da 1 KB si porta via 32 KB, allora gioite pure.

Come dicevo prima, anche Windows NT usa questo metodo, ma mi faceva giustamente notare Luciano che NT ha un piccolo optional in più, il file system NTFS. OS/2 non permette i nomi lunghi su FAT, ma anche lui ha il suo piccolo optional, noto come HPFS. Linux ha l'EXT2FS, e così via...

Insomma, vi si frammenta, spreca spazio coi cluster, li perde, li incrocia, ora spreca spazio anche memorizzando il nome di un file... ma forse è meglio fare finta di niente e premere START.

                                                        innovativamente,
                                                           Cthulhu(TM)


Beta [ Pagina Principale || Sommario || Redazione || Informazioni || Beta Browser ]
Beta - La rivista ipertestuale tecnica, copyright © 1994-95 Luciano Giustini e Fernando Carello. Tutti i diritti riservati.
(-installazione in rete)