Introduction
Il arrive parfois que la mémoire RAM d’un ordinateur ne soit pas assez grande pour permettre à tous les programmes de s’y exécuter en même temps. Ce problème est connu depuis longtemps et plusieurs solutions ont été proposées. Dans les années 1960, les premiers ordinateurs découpaient les programmes en plusieurs parties (overlays) et les chargeaient dans la mémoire au fur et à mesure de leur exécution. Aujourd’hui, les ordinateurs utilisent une technique plus moderne: la mémoire virtuelle.
En plus de résoudre le problème de la taille des programmes, la mémoire virtuelle permet aussi d’isoler les processus les uns des autres. Dans un système avec de la mémoire virtuelle, tous les processus ont l’illusion d’avoir la totalité de la mémoire de l’ordinateur à leur disposition, mais en fait ils se la partagent sans pouvoir interférer les uns avec les autres. Cette isolation est implémentée par du hardware spécialisé et elle protège ainsi les processus les uns des autres.
Ce hardware spécialisé c’est la MMU (Memory Management Unit) et c’est ce que nous étudions dans ce chapitre.
La MMU (Memory Management Unit)
L’idée de base consiste à proposer une mémoire virtuelle qui offre l’entier de l’espace d’adressage à chaque processus. Sur un système avec un bus d’adresse de 16 bits, la mémoire virtuelle est de \(2^{16} = 64KiB\) pour chaque processus. Sur un système 32 bits, la mémoire virtuelle est de \(2^{32} = 4GiB\) pour chaque processus.
Les zones de la mémoire virtuelle qui sont effectivement utilisées par un processus sont mappées vers des zones de la mémoire physique. Ce mapping est fait par la MMU dont le rôle est de traduire les adresses virtuelles en adresses physiques. En d’autres termes, le processeur émet des adresses virtuelles sur son bus d’adresses et le MMU traduit ces adresses virtuelles en adresses physiques pour les envoyer sur le bus d’adresses de la mémoire. Pour faire cette traduction, la MMU se situe entre le processeur et le bus d’adresses. Comme on le voit dans la fugure ci-dessous, la MMU reçoit les adresses virtuelles du processeur et les traduit en adresses physiques vers le bus d’adresses.
Cette traduction (ou translation) d’adresse n’est pas faite à l’échelle d’un seul octet ou même d’un seul mot de 32 bits, mais à l’échelle d’une page. L’espace d’adressage est découpé en pages de taille fixe (habituellement 4KiB) et la page est l’unité de traduction de la mémoire virtuelle par la MMU.