Gestion de la mémoire et espace d'adressage des processus sous Linux

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-noir
  • mapper_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.

Étiquettes: noyau linux Gestion de Mémoire espace d'adressage des processus MMU TLB

Publié le 2 août à 17h30