Previous Up Next

2  Seconde couche logicielle : gestion de volumes

D’un point de vue logique, les secteurs d’un disque sont regroupés pour former un « volume ». Un volume peut correspondre à l’ensemble des secteurs d’un disque donné, mais il arrive qu’un disque soit décomposé en plusieurs volumes distincts, chaque volume représentant une partie de la surface du disque.

Pour définir la place de chaque volume (ou partition) sur le disque on structure le disque. Le premier secteur du disque correspond au « master boot record », MBR. Nous convenons ici que ce premier secteur définit le nombre de volumes présents sur le disque, la position (en coordonnée piste/secteur) du premier secteur de chaque volume, ainsi que le nombre de secteurs consécutifs associés au volume. On conviendra d’un maximum de 8 volumes présents sur un disque. De plus une information associée à chaque volume permettra de déterminer si le volume est :


Exercice 4
 (Secteur d’amorce primaire)   Proposez une structure de donnée pour stocker les informations inscrites dans le MBR.

Exercice 5
 (Initialisation des volumes)   Proposez une fonction C qui lit le MBR est initialise, avec le résultat de cette lecture, une structure de donnée globale accessible par toutes autres procédures. Cette structure de donnée sera gardée en mémoire durant toute l’utilisation du disque.

Proposez de même une fonction de sauvegarde de la structure de données vers le MBR qui sera appelée en fin d’utilisation du disque.


Exercice 6
 (Conversion d’adressage)   Un bloc est un secteur du disque qui est associé à un volume. Les blocs d’un volume sont contigus. Aussi un bloc est identifié par un simple numéro de bloc relatif au volume. Proposez une formule de conversion qui permette de transformer un couple (numéro de volume, numéro de bloc) en un couple (numéro de cylindre, numéro de secteur).

Exercice 7
 (Bibliothèque d’accès aux volumes : vol)   Pour pouvoir utiliser l’organisation en volumes du disque, nous nous proposons de réaliser un ensemble de fonctions qui permettront de lire, écrire ou formater des blocs :
void read_bloc(unsigned int vol, unsigned int nbloc, 
               unsigned char *buffer);
void write_bloc(unsigned int vol, unsigned int nbloc,
                const unsigned char *buffer);
void format_vol(unsigned int vol);
Notez que l’utilisation de ces fonctions suppose que le disque ait été initialisé et que le MBR ait été lu en mémoire.

Exercice 8
 (Gestionnaire de partitions)   Il s’agit de réaliser un petit programme qui permette de lister les partitions présentes sur un disque, de créer une nouvelle partition, de supprimer une partition... Voir l’encart à ce propos.

Squelette d’un gestionnaire de partitions

L’archive

/home/enseign/ASE/src/vm-skel.tgz
      

contient le squelette d’un gestionnaire de volumes. Vous pouvez l’utiliser comme point de départ de votre développement d’un gestionnaire de partitions. En particulier cela vous décharge complètement de la gestion de l’interaction avec l’utilisateur.

Il vous faut copier le fichier vm-skel.c pour créer un fichier vm.c que vous compléterez. Un Makefile vous est fourni pour construire les différents exécutables.

Pour faciliter les choses, on peut introduire dans la bibliothèque drive d’accès au matériel une fonction init_master() qui initialisera le disque maître utilisé. Dans la suite des développements, nous ne nous préoccuperons plus du disque esclave.

La fonction principale de notre gestionnaire de partitions se doit de faire appel aux fonctions d’initialisation de ce disque et se doit de charger le MBR en mémoire :

/* init master drive and load MBR */
init_master();
load_mbr();

Validation de la bibliothèque de gestion de volumes

Comme précédemment, il s’agit de valider votre travail avant de poursuivre les développements.

Le protocole suivant vérifie un minimum de cohérence dans votre implantation :

En particulier, vous pouvez ou non quitter et relancer le gestionnaire de volume entre chaque étape.


Previous Up Next