Je vais reprendre ce que dit Melem dans cette discussion et qui me semble la réponse la plus pertinente :
-> Quand tu alloues un tableau de n octets, tu réserves une zone mémoire virtuelle continue de par exemple 0x1000 à 0x1000 + n.
-> Physiquement tu as différents blocs, par exemple 2 : 0x1223 à 0x1223 + n/2 et 0x95FA à 0x95FA + n/2. Tant que tu adresses dans ton programme entre 0x1000 et 0x1000 + n/2, la MMU fait la translation vers [0x1223, 0x1223 + n/2]. Quand tu adresses [0x1000+n/2, 0x1000 + n], la MMU fait la translation vers [0x95FA, 0x95FA + n/2]. Quand le processeur demande à lire une donnée à l'adresse 0x1000 + i, la MMU fait la translation d'adresse, récupère la valeur dans la mémoire à l'adresse physique calculée et la retourne au processeur. C'est tout simplement le principe de la mémoire virtuelle.
-> Ton programme n'a aucun accès aux adresses physiques.
-> Les adresses physiques peuvent même varier au cours de l'exécution si les pages sont swappées.
-> Seules les adresses virtuelles sont stables et connues. Le programme (et le compilateur lorsqu'il le génère) ne s'appuie que là-dessus.
Partager