Struttura del virtual file system

Trattandosi di un file system virtuale sono state operate delle scelte progettuali al fine di ottenere il miglior risultato cercando di mantenere il più possibile semplici le cose. Per prima cosa va detto che l'intero VFS è rappresentato da un file; questo file si troverà sempre dentro la cartella /tmp/ e avrà nome vfs.tmp. In realtà esso viene creato al momento dell'inizializzazione del gestore e cessa di esistere quando il gestore viene chiuso. Di fatto, dunque, la sua esistenza è completamente trasparente all'utilizzatore del VFS. La sua presenza diviene manifesta se e solo se per qualche motivo il gestore non riesce ad accederci, abbiamo quindi un errore in apertura del file /tmp/vfs.tmp.

La struttura interna di vfs.tmp è rappresentata in figura 3.1:

Figura 3.1: Struttura del file /tmp/vfs.tmp
Image struttura

All'interno delle prime due sezioni (FLI e FLB) risiedono, rispettivamente, l'offset al primo i-node libero e l'offset al primo blocco libero. Insieme occupano sul file una dimensione fissa pari a quella di due interi.

Immediatamente dopo i due puntatori iniziali c'è la zona dedicata agli i-nodes. Essa ha una dimensione variabile dipendente dal numero di i-nodes presenti. Ogni i-node ha una dimensione pari a quella di sei interi, e porta con se le seguenti informazioni:

Per offset (e questa è una convenzione utilizzata in tutto il progetto) si intende il numero di bytes che separano la posizione 0 nel file fino al primo byte dell'oggetto in questione. Ad esempio se diciamo che un i-node ha offset 100 si intende che la rappresentazione dell'i-node nel VFS si trova 100 bytes dopo l'inizio del file.

Come si è potuto intuire dalla struttura di un i-node, la gestione degli i-nodes liberi è affidata ad una lista concatenata: ogni i-node libero punta al successivo libero. Gli i-nodes usati invece puntano a 0 in quanto non sono compresi nella lista. Anche l'ultimo i-node libero punta a 0.


Immediatamente dopo gli i-nodes si arriva alla parte del file dedicata ai blocchi, che conterrà i file veri e propri o le directory structures in caso di un blocco dedicato ad una directory. È da sottolineare che ogni file in questo file system occuperà al massimo un intero blocco.

Anche le directory occupano al massimo un blocco dati e sono così composte:

È facile intuire che all'interno di una directory il numero massimo di entry sia


DIM_BLOCCO / (FILE_NAME_SIZE + DIM_INTERO)

La gestione dei blocchi liberi invece viene affidata anche in questo caso ad una lista concatenata: ogni blocco libero punta al blocco libero successivo (ne contiene il suo offset) mentre un blocco occupato non punta a nulla; l'ultimo blocco libero invece punta a 0. La dimensione totale di questa area del vfs.tmp è uguale alla dimensione del blocco moltiplicata per il numero di i-nodes disponibili.


La dimensione totale del file che rappresenta il VFS dunque sarà pari a:


2 * sizeof(int) + #I_NODES * 6 * sizeof(int) + DIM_BLOCCO * #I_NODES

Inoltre è fondamentale specificare che il primo i-node è sempre dedicato a descrivere la directory root e punterà sempre e comunque al primo blocco, il quale rappresenterà fisicamente questa directory.




Lorenzo Baloci, Daniele Turato, Alessio Zennaro - Settembre 2006