I. Gestion de la mémoire
1. Concepts de base
L'Unité de gestion de mémoire (MMU) est un composant matériel chargé de traduire les adresses virtuelles en adresses physiques, avec des fonctions de protection et de contrôle du cache processeur. Le Tampon de traduction (TLB) optimise cette conversion en stockant les traductions récentes, évitant ainsi des accès coûteux aux tables de pages en mémoire.
2. Mémoire virtuelle
Linux attribue à chaque processus un espace d'adressage virtuel de 4Go, séparé en zones utilisateur (0x00000000-0xBFFFFFFF) et noyau (0xC0000000-0xFFFFFFFF). La conversion entre adresses virtuelles et physiques utilise un mécanisme de pagination à trois niveaux (PGD/PMD/PTE), géré par le MMU.
3. Organisation de la mémoire
L'espace utilisateur contient :
- Segment de code (text)
- Données initialisées (data) et non initialisées (bss)
- Tas dynamique (heap) géré par malloc/brk
- Zones mappées (mmap) pour fichiers et bibliothèques
- Pile d'exécution (stack) de 8Mo par défaut
Le noyau utilise des structures vm_zone_struct organisées en liste chaînée et arbre rouge-noir pour gérer ces régions.
4. Allocation mémoire
Le système utilise deux mécanismes principaux :
- Système partenaire (Buddy System) : Gère les fragments de mémoire en puissances de deux (1, 2, 4...1024 pages), réduisant les fragments externes
- Allocateur Slab : Optimisé pour les petits objets fréquents (comme les descripteurs de processus), en conservant les objets libérés dans des pools pour réutilisation
5. Zones mémoire du noyau
struct mm_noyau {
zone_directe[896Mo]; // Mappage direct de la physique
struct {
vmalloc_region; // Allocation non contigüe
kmap_persistant; // Mappage permanent de mémoire haute
zone_fixe; // Adresses spécifiques (ACPI, etc.)
} memoire_haut;
};
II. Espace d'adressage des processus
1. Structures clés
Le descripteur de processus mm_struct contient :
struct mm_struct {
struct zone_memoire *zones_list; // Liste des zones
struct rb_root zones_arbre; // Arbre rouge-noir
pgd_t *reertoire_pages; // Table des PGD
unsigned long start_code, end_code; // Segment de code
// ... autres champs de gestion
};
2. Opérations sur les zones
Les fonctions principales :
trouver_zone(addr): Recherche par arbre rouge-noirmapper_memoire(): Crée une nouvelle zone via do_mmap()unmap_memoire(): Supprime une zone
3. Traduction d'adresses
Le processeur utilise les tables de pages (PGD/PMD/PTE) pour convertir les adresses virtuelles. Le TLB cache ces traductions pour accélérer l'accès. En cas de cache-miss (TLB miss), le MMU effectue une "page walk" dans les tables en mémoire.