Il s'agit d'implémenter un système de fichiers par simulation au-dessus d'Unix: le contenu des périphériques physiques du système simulé sera contenu dans des fichiers Unix.
Ce projet devra être réalisé en langage C en utilisant les fonctions POSIX étudiées en cours. Il devra impérativement fonctionner sur les machines de l'UFR. Le travail pourra être effectué par groupe de quatre étudiants au plus. Un rapport devra être rédigé et rendu avant la soutenance. Les dates de remise des rapports et soutenance seront précisées ultérieurement.
Le système de fichier ifs (pour iconic file system) reconnaît trois types de fichiers:
Les fichiers ordinaires et répertoires peuvent être attachés à (au plus) un fichier icone permettant à un environnement graphique de présenter agréablement les fichiers du système. Mais dans le cadre de la simulation, on interprètera le contenu des fichiers icones comme du texte ASCII simple.
Le disque ifs (fichier Unix pour la simulation) est consistué de blocs de taille fixe (unité de lecture/écriture): 128 octets. L'ensemble des blocs est divisé en trois sous-ensembles: la zone de description, la zone des noeuds et la zone des données.
Elle contient au moins un bloc dont le contenu peut être interprété de la façon suivante:
0x49465300
,Note: Les curieux pourront rechercher à l'aide de leur moteur de recherche favori l'IEN 137
(Internet Experiment Notes), Holy Wars and A Plea for Peace
de Danny Cohen datant du 1er avril 1980.
La zone des noeuds contient la liste des noeuds utilisés ou libres ainsi que les attributs associés aux noeuds; cette zone pouvant etre vue comme un tableau de structures noeud:
struct noeud { USHORT etat; USHORT type; USHORT taille; USHORT liens; USHORT icone; USHORT blocs[11]; }; #define NOEUD_LIBRE (USHORT)0 #define NOEUD_UTILISE (USHORT)1 #define EST_LIBRE(pn) ((pn)->etat==NOEUD_LIBRE) #define ORDINAIRE (USHORT)0 #define REPERTOIRE (USHORT)1 #define ICONE (USHORT)2 #define IS_ORD(pn) ((pn)->type==ORDINAIRE) #define IS_REP(pn) ((pn)->type==REPERTOIRE) #define IS_ICO(pn) ((pn)->type==ICONE) ...
Note: le type USHORT
est le type des entiers courts (16 bits) en représentation Little-Endian.
Le champ etat (considéré comme un booléen) permet de déterminer si le noeud est libre ou utilisé (accessible à travers une référence).
Le champ type peut prendre l'une des valeurs (au moment de son allocation) : REPERTOIRE (pour un noeud répertoire) ou ORDINAIRE (pour un noeud fichier ordinaire) ou ICONE (pour un noeud fichier icone).
Le champ taille contient la taille exprimée en octets de l'objet.
Le champ liens contient le nombre de noms associés au noeud.
Le champ icone contient le numéro du noeud représentant l'icone du fichier associé. Attention: les fichiers icones n'ont pas d'icone associée.
Le champ blocs contient les numéros des premiers blocs de données associées au noeud. Le onzième entier pointe sur un bloc de données contenant la suite de la liste des blocs du noeud (le dernier entier de ce bloc pointant lui-même sur un autre bloc de données contenant la suite de la liste ad lib.)
Les répertoires sont des noeuds dont les données sont à interpréter de façon très particulière: il s'agit d'une liste de couples (nom, numéro de noeud) permettant d'associer à un noeud particulier (donc non libre) un nom que l'on pourra utiliser comme élément d'une référence. Une entrée de répertoire (couple) possède la structure suivante :
struct entree_repertoire { usigned char nom[30]; /* nom du lien associé au noeud */ USHORT numero; /* numero du noeud associé au nom */ };
Le champ numéro doit contenir un numero de noeud valide lorsque l'entrée est occupée. Si l'entrée a été effacée, numéro doit être à zéro.
Le champ nom contient une chaine de caractères à la C (terminée
par ASCII 0), mais jamais de longueur nulle! De plus
les noms ne doivent pas contenir le caractère '/'
(dit de séparation) utilisé pour
composer les noms en références.
Constituée de blocs, on peut en distinguer quatre types: les blocs de données des fichiers (sans structure particulière), les blocs de données associés aux répertoires, les blocs de données utilisés pour constituer la liste des blocs d'un noeud et les blocs de données libres.
On devra entres autres :
Les différentes fonctions devront être conformes à la spécification suivante:
#define ENTREE_REPERTOIRE_INCONNUE 1 #define DISQUE_INCONNU 2 #define DESCRIPTEUR_INCONNU 3 #define MAUVAISE_POSITION 4 ...
Il est recommandé de procéder avec beaucoup de précautions... Demandez-vous à quoi sert la zone de description d'un disque, ce que l'on y trouvera, où est placé le noeud racine d'un disque, etc. N'hésitez pas à rajouter ce qui semble manquer (à condition d'y réflechir à deux fois).
De plus, il est rappelé que les enseignants sont normalement disposés à répondre à vos questions de vive voix ou par courrier électronique, profitez-en.
S'il est conseillé d'échanger des informations entre différents groupes de travail, il n'est pas conseillé de copier les uns sur les autres. Le sujet est suffisamment libre d'interprétation pour que chaque groupe trouve une solution originale à chaque problème.