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 et 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

Le répertoire vm du dépôt https://gitlab-etu.fil.univ-lille1.fr/ms1-ase/src 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 compléter le fichier vm.c. 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();

Commandes minimales de gestion de volumes - mkvol et dvol

Sans nécessiter un gestionnaire de partitions complet, la poursuite des développements nécessite de pouvoir créer une partition sur votre disque. À défaut d’un gestionnaire de partitions, on développera donc à minima un programme mkvol (make volume) qui permet de créer un volume d’une taille donnée (-b, nombre de blocs) à partir du cylindre/secteur donné (-c, -s) et un programme dvol (display volumes) qui affiche les informations attachées au(x) volume(s) présent(s) sur le disque.


Previous Up Next