Previous Up Next

4  Troisième couche logicielle, 2e partie : structure d’un fichier

Chaque fichier ou répertoire est défini par un inœud, tel que le cours le présente, avec un type, une taille de fichier en octets, et les tables de numéro de blocs, « direct », « indirect » et « double indirect ».


Exercice 13
 (Structure d’un inœud)   Définissez la structure struct inode_s qui sera utilisée pour représenter un inœud.

Les inœuds sont bien entendu enregistrés sur le disque. Nous choisissons d’enregistrer un unique inœud par bloc. (Cela est inhabituel, la taille d’un inœud étant petite devant celle d’un bloc.) Un inœud est identifié par son inombre qui ne sera dans notre cas rien d’autre qu’un numéro de bloc.

Nous définissons deux fonctions utilitaires pour réaliser l’écriture et la lecture sur le disque d’un inœud.

void read_inode(unsigned int inumber, struct inode_s *inode);
void write_inode(unsigned int inumber, struct inode_s *inode);

ainsi que deux fonctions de création et destruction d’un inœud :

unsigned int create_inode(enum file_type_e type);
int delete_inode(unsigned int inumber);

La fonction create_inode() est chargé de l’allocation d’un bloc pour y ranger l’inœud, et de l’initialisation de celui-ci. Elle retourne le inombre correspondant.

La fonction delete_inode() libère l’ensemble des blocs de données associés à l’inœud, y compris le bloc de l’inœud lui-même.


Exercice 14
 (Lecture et écriture d’inœuds)   Donnez une implémentation des fonctions read_inode() et write_inode().

Exercice 15
 (Création et suppression d’un inœud)   Donnez une implémentation des fonctions de création et destruction d’un inœud : create_inode() et delete_inode().

Afin de développer la couche logicielle supérieure, nous allons présenter un fichier sous la forme d’une suite continue de blocs de données. Il est donc nécessaire de convertir un indice de bloc d’un inœud en un numéro de bloc dans le volume. Une telle conversion repose sur le parcours de la table des numéros de blocs directs, indirects et double indirects de l’inœud.


Exercice 16
 (Bloc volume d’un bloc inœud)   Développez une fonction
unsigned int vbloc_of_fbloc(unsigned int inumber, 
                            unsigned int fbloc); 
qui retourne le numéro de bloc sur le volume qui correspond au fbloc-ième bloc de l’inœud. Dans un premier temps, cette fonction retourne une valeur nulle si le bloc n’a pas été alloué.

Cette fonction vbloc_of_fbloc() est utilisée pour accéder en lecture à un bloc de données correspondant à un inœud. Si l’on désire accéder en écriture à un tel bloc, il est nécessaire d’allouer ce bloc et de le rattacher à la structure des blocs directs, indirects, double indirects de l’iœud.

Nous ajoutons un paramètre booléen à la fonction vbloc_of_fbloc() qui indique si le comportement de la fonction doit être de retourner une valeur nulle ou d’allouer le bloc en cas de bloc non encore existant.


Exercice 17
 (Allocation d’un bloc d’inœud)   Développez la nouvelle version de la fonction
unsigned int vbloc_of_fbloc(unsigned int inumber, 
                            unsigned int fbloc,
                            bool_t do_allocate);
qui retourne le numéro du bloc dans le volume qui correspond au fbloc-ième bloc de l’inœud. Si ce bloc n’est pas alloué et do_allocate, la fonction se charge de l’allocation du bloc et de le connecter à la structure de l’inoœud.

Validation de la troisième couche logicielle : structure d’un volume et d’un fichier

Vous pourrez valider votre bibliothèque de gestion d’un volume et de gestion d’inœuds à l’aide de l’archive que nous vous fournissons et qui permet de produire les commandes listées dans l’encart «Validation de la bibliothèque de manipulation de fichier par leur inombre». Voir le répertoire ifile du dépôt Git :

https://gitlab-etu.fil.univ-lille1.fr/ms1-ase/src


Previous Up Next