Skip to content
Maxime Chéramy edited this page Feb 24, 2012 · 2 revisions

Le VMM (Virtual Memory Manager) est le gestionnaires des pages libres et utilisées en mémoire virtuelle (c'est-à-dire dans le répertoire de page courant).

La VMM s'occupe donc de savoir quelles sont les pages libres de la mémoire virtuelle (c'est-à-dire les pages non mappées à des pages physiques) et quelles sont celles déjà utilisées. Pour cela, on utilise deux listes doublements chainées : une pour les pages libres, et une pour les pages utilisées. Chaque nœud de ces listes décrit un bloc de page (en fait il contient simplement le nombre de pages du bloc). Chacun de ces nœuds se trouve au début du bloc de page qu'il décrit. L'adresse (virtuelle) d'un nœud est donc aussi le début du bloc, il suffit d'ajouter la taille d'un nœud (sizeof(struct noeud) = 16 octets) pour obtenir l'adresse du début du bloc. Les deux listes sont ordonnées par adresses de blocs de pages croissantes.

Nous allons maintenant décrire le processus d'allocation de pages par la VMM. Lorsque la fonction allocate_new_pages(nb_pages) est appelée, la VMM parcourt la liste des pages libres pour voir s'il existe un bloc libre de taille assez importante (c'est-à-dire possédant au moins nb_pages libres). S'il n'existe pas de tel bloc, la VMM va créer une nouvelle zone libre en haut du tas. Ensuite la VMM va réserver nb_pages pages physique et mapper chacune de ces pages physiques aux pages virtuelles libres du bloc en question. Par la suite, la VMM va créer un nouveau nœud descripteur de bloc de pages et le placer au début du bloc (comme vu dans le paragraphe précèdent). Elle va ensuite rajouter ce nœud dans la liste des blocs de pages utilisées (et éventuellement le retirer de la liste des blocs de pages libres). Cet algorithme est appelé First Fit, c'est l'un des plus simples à mettre en place et il a pour avantage d'être très rapide. Il est particulièrement adapté pour les systèmes qui disposent de plus de mémoire que nécessaire car il ne parcourt pas de longues structures afin de trouver l'emplacement optimal.

Pour mettre cette gestion des pages un peu plus au clair, on peut voir un exemple de ce à quoi peut ressembler la mémoire virtuelle sur la figure qui suit. En bleu, les structures décrivant les blocs de pages, en gris les blocs de pages utilisées, et en blanc les blocs de pages libres. Sur ce schéma, on peut voir trois blocs de pages. La première (en partant du bas de la mémoire) est donc un bloc de pages utilisées, la structure au début de ce bloc est donc le premier nœud de la liste des blocs de pages utilisées. Ce nœud pointe donc vers le prochain bloc de pages utilisées. Le bloc de pages libres au milieu est le seul de sa liste et ne pointe donc vers rien.

Dans cet exemple, si le noyau demande l'allocation de 3 pages, celles-ci seront placées dans le bloc libre qui sera coupé en deux. Un nouveau bloc de pages utilisées (contenant 3 pages) sera créé et le bloc libre sera remplacé par un nouveau bloc de taille 1. Si le noyau demande l'allocation de 5 pages, la VMM va devoir agrandir le tas, en créant une nouvelle zone libre en haut du tas.

Clone this wiki locally