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 :
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.
Notez que l’utilisation de ces fonctions suppose que le disque ait été initialisé et que le MBR ait été lu en mémoire.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);
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.