3IS - Système d`exploitation linux
Transcription
3IS - Système d`exploitation linux
3IS - Système d'exploitation linux Gestion de la mémoire 2010 – David Picard Contributions de : Arnaud Revel, Mickaël Maillard [email protected] ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Process adress space ● ● L'espace d'adressage du processus est l'espace mémoire vu par le processus Propriétés : – – – Il est total (si une adresse est codée sur 32bits, alors le processus voit 4Go de mémoire) Il est continu (toutes les zones entre 0x00 et la plus grande adresse sont adressables) Il est privé (seul le processus et le noyau ont accès à la mémoire) ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Découpage de l'espace d'adressage du processus ● 5 zones – – – – – ● ● Un espace réservé Une zone de code Une zone de données Une pile Le noyau 0xffffffff kernel 0xc0000000 stack La zone kernel est accessible uniquement en mode noyau Les zones de code, données et pile sont accéssibles en mode user heap 0x8xxxxxxx text 0x80000000 XXXXXXX 0x00000000 ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Plusieurs processus ● Pour chaque processus l'espace d'adressage a les mêmes propriétés, malheureusement impossibles à réaliser : – – ● Total : toutes les machines n'ont pas 4Go de mémoire (voire 256To pour les x86-64) Privé et continu : Avec plusieurs processus, soit l'espace est discontinu, soit il n'est plus privé Le noyau et la zone réservée sont communs à tous les processus ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Mémoire virtuelle ● ● Les adresses de l'espace d'adressage du processus ne sont pas les adresses physiques Deux mécanismes : – – Adresses logiques Segmentation Pagination Segmentation Adresses linéaires Pagination Adresses physiques Les adresses logiques sont les adresses vues par le processus ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Segmentation ● ● La mémoire est divisée en segments Une adresse logique est séparée en deux partie : – – ● Un identifiant de segments appelé sélecteur de segment Un décalage relatif dans le segment Sur x86, des registres sont dédiées aux stockage des segments : – – – cs : pointe vers le segment de code ss : pointe vers le segment de pile ds : pointe vers le segment de données ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Descripteurs de segment ● ● ● ● Chaque segment est représenté par un descripteur de segment de 8 octets Les descripteurs de segment sont stockés dans une table (soit globale, la GDT, soit locale, la LDT) Il n'y a qu'une seul GTD, alors que chaque processus peut avoir sa LDT (s'il a besoin de segments supplémentaires) Le descripteur de segment contient : – – – – L'adresse linéaire du premier octet du segment La taille du segment Le type de segment Les droits d'accès à ce segment (la fameuse Segmentation fault) ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Types de descripteurs de segments ● Descripteur de segment de code : – ● Descripteur de segment de données – ● Décrit un segment de données ou de pile (GDT ou LDT) Descripteur de segment d'état de tâche – ● Décrit un segment de code (GDT ou LDT) Décrit un segment contenant le contexte d'un processus (Task State Segment – TSS, rappelez vous la task_struct des processus) en GDT Descripteur de la table locale de descripteurs – Décrit un segment qui contient un LDT (en GDT) ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Sélecteur de segments ● Contient deux champs : – – Un index pour une table de descripteurs de segments Un indicateur si la table est la GDT ou la LDT (TI) Index TI Sélecteur de segment Deux registres permettent de stocker l'adresse de la GDT (GDTR) et de la LDT courante (LDTR) ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Calcul de l'adresse linéaire Index offset TI GDTR ou LDTR 8 * + GDT ou LDT Descripteur de segment base + Adresse linéaire ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Pagination ● ● ● Découpage de l'espace d'adresses linéaires en pages Découpage de la mémoire en cadres de page Association entre les pages et les cadres de page – – – Association non linéaire (les adresses ne sont pas identiques) Gestion des droits sur les page (exception Page fault) Un mapping par processus ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Pagination 0xffffffff 0xc0000000 0x9a5624ce kernel Cadre 2 Page 5 stack Cadre 4 Page 4 Cadre d'un autre processus Page 3 Cadre 3 Cadre 5 0x8xxxxxxx heap Page 2 0x80000000 text Page 1 Cadre d'un autre processus XXXXXXX Cadre 1 0x00000000 0x00000000 Adresse linéaires du processus Mémoire physique ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Adresses linéaires ● Une adresse linéaire est découpée en trois champs : – – – Un répertoire (directory) sur les bits de poids fort, qui indique quel répertoire de tables de pages utiliser Une table (table) sur les bits intermédiaires, qui indique quelle table de page utiliser Un décalage (offset) sur les bits de poids faibles, qui indique la position dans la page directory table ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS offset Conversion en adresses physiques directory table offset Cadre de page table de pages Répertoire des pages + + + cr3 Registre contenant l'adresse du répertoire de pages ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Structure des répertoires et des tables de pages ● ● ● ● ● Indicateur Present : indique si la page est stockée en mémoire (si 0, expection Page fault) Zone contenant l'adresse d'un cadre de page contenant soit une table de page (pour les répertoire) soit une page (pour les tables de pages) Indicateur Dirty : indique qu'un écriture a été réalisée sur le cadre de page Indicateur Read/Write : donne les droits en lecture/écriture sur le cadre de page Indicateur User/Supervisor : définit le niveau de droits nécéssaire pour accéder à la page ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS La pagination dans Linux ● ● ● ● ● 4 niveaux d'indirection (3 répertoires, 1 table et l'offset) Chaque processus dispose de son propre répertoire global et de tables de pages privées Lors d'une commutation de processus, le registre contenant l'adresse du répertoire est sauvegardé dans la task_struct La taille d'une page est disponible par la macro PAGE_SIZE Le noyau maintient un ensemble de tables de pages pour son usage propre ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Scénarios de traduction Lors de la traduction d'une adresse linéaire en adresse physique, plusieurs scénarios peuvent intervenir : ● ● ● ● ● L'entrée dans la table est valide : l'adresse est remplacée par l'adresse physique correspondante L'entrée est invalide : il faut trouver un cadre de page libre, et ajouter la correspondance avec son adresse physique dans la table L'entrée est valide, mais les droits en lecture/écriture sont insuffisant : il faut lever une exception L'entrée est valide, mais les droits en contexte sont insuffisant : il faut lever une exception L'entrée est valide, mais le cadre ne se situe pas en mémoire centrale : il faut récupérer le cadre sur le support de stockage et le mettre en mémoire centrale ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Gestion des Page fault Accès licite : allouer un nouveau cadre de page Le type d'accès correspond avec les droits de la région mémoire Accès illicite : envoyer un signal SIGSEV (correspondant souvent à la fameuse segmentation fault) L'adresse appartient à l'espace d'adressage du processus L'exception s'est-elle produite en mode utilisateur Erreur du noyau : tuer le processus ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Accélérateurs matériels ● Les processeurs modernes permettent de réaliser les opérations de segmentation et de pagination au niveau matériel (MMU) – – – Remplir les registres contenant les adresses des structures de mémoire virtuelle (répertoires, tables, etc) Activer la segmentation ou la pagination via un registre de contrôle La MMU se charge de faire la conversion automatiquement ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Avantages de la mémoire virtuelle ● ● ● ● ● Abstraction de la mémoire (donc indépendance à une configuration matérielle précise) Gestion facile des droits Masque la fragmentation de la mémoire (simplifie la vie des programmeurs) Masque la gestion complexe de la mémoire qui est gérée par l'OS Évite la réallocation ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Cache ● ● ● ● L'accès à la mémoire centrale est couteux Les processeurs disposent d'une petite zone de mémoire appelée cache Un mécanisme matériel permet de stocké dans ce cache les données (les pages) fréquement utilisées Si une donnée est demandée et absente du cache, elle est chargée en cache ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Transition Lookaside Buffers ● ● ● ● ● Une unité particulière appelée TLB sert à accélérer la conversion des adresses linéaires en adresses physique Elle stocke les association entre adresses linéaires et adresses physique C'est au noyau de gérer la validité des entrées des TLB (via flush_tlb_* ), car c'est lui qui décide des associations entre pages et cadres de pages Lorsque le registre de contrôle contenant l'adresse du répertoire principale est changé, toutes les entrées sont invalidées Lors d'une commutation de processus, les TLB sont donc vidés ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Descripteur de mémoire ● ● ● ● struct mm_struct : contient toute l'information relative à l'espace d'adressage d'un processus Contenu dans le champs mm du descripteur de processus Les descripteurs sont rangés dans une liste doublement chaînée Partage de mm_struct entre plusieurs processus possible (syscall clone() et fork()) ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS mm_struct (mm_types.h) struct mm_struct { struct vm_area_struct * mmap; /* list of VMAs */ ... pgd_t * pgd; /*repertoire global de pages */ atomic_t mm_users; /* How many users with user space? */ atomic_t mm_count; /* How many references to "struct mm_struct" (users count as 1) */ int map_count; /* number of VMAs */ ... unsigned long unsigned long unsigned long data*/ unsigned long unsigned long environnement */ total_vm, locked_vm, shared_vm, exec_vm; stack_vm, reserved_vm, def_flags, nr_ptes; start_code, end_code, start_data, end_data; /* code et start_brk, brk, start_stack; /* tas et pile */ arg_start, arg_end, env_start, env_end; /* arguments et ... }; ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Régions de mémoire ● Mises en oeuvre dans la structure vm_area_start ● Identifie un intervalle d'adresses linéaires ● Ne se chevauchent jamais ● Fusion ou séparation possibles lors d'allocation/désallocation si les droits des régions sont identiques ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS vm_area_struct (mm_types.h) /* * This struct defines a memory VMM memory area. There is one of these * per VM-area/task. A VM area is any part of the process virtual memory * space that has a special rule for the page-fault handlers (ie a shared * library, the executable area etc). */ struct vm_area_struct { struct mm_struct * vm_mm; /* The address space we belong to. */ unsigned long vm_start; /* Our start address within vm_mm. */ unsigned long vm_end; /* The first byte after our end address within vm_mm. */ /* linked list of VM areas per task, sorted by address */ struct vm_area_struct *vm_next, *vm_prev; pgprot_t vm_page_prot; unsigned long vm_flags; /* Access permissions of this VMA. */ /* Flags, see mm.h. */ ... /* Function pointers to deal with this struct. */ const struct vm_operations_struct *vm_ops; ... }; ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Opérations sur les régions /* * These are the virtual MM functions - opening of an area, closing and * unmapping it (needed to keep files on disk up-to-date etc), pointer * to the functions called when a no-page or a wp-page exception occurs. */ struct vm_operations_struct { void (*open)(struct vm_area_struct * area); void (*close)(struct vm_area_struct * area); int (*fault)(struct vm_area_struct *vma, struct vm_fault *vmf); /* notification that a previously read-only page is about to become * writable, if an error is returned it will cause a SIGBUS */ int (*page_mkwrite)(struct vm_area_struct *vma, struct vm_fault *vmf); ... }; ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Droits d'accès aux régions /* * vm_flags in vm_area_struct, see mm_types.h. */ #define VM_READ 0x00000001 /* currently active flags */ #define VM_WRITE 0x00000002 #define VM_EXEC 0x00000004 #define VM_SHARED 0x00000008 /* mprotect() hardcodes VM_MAYREAD >> 4 == VM_READ, and so for r/w/x bits. */ #define VM_MAYREAD 0x00000010 /* limits for mprotect() etc */ #define VM_MAYWRITE 0x00000020 #define VM_MAYEXEC 0x00000040 #define VM_MAYSHARE 0x00000080 #define VM_GROWSDOWN 0x00000100 #define #define #define #define #define #define #define VM_DONTCOPY 0x00020000 VM_DONTEXPAND 0x00040000 VM_RESERVED 0x00080000 VM_ACCOUNT 0x00100000 VM_NORESERVE 0x00200000 VM_HUGETLB 0x00400000 VM_NONLINEAR 0x00800000 /* general info on the segment */ /* /* /* /* /* /* /* Do not copy this vma on fork */ Cannot expand with mremap() */ Count as reserved_vm like IO */ Is a VM accounted object */ should the VM suppress accounting */ Huge TLB Page VM */ Is non-linear (remap_file_pages) */ ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Swap ● ● ● ● Parfois, la mémoire centrale n'est pas suffisante pour stocker toutes les données (code et data) L'intérêt de la mémoire virtuelle est que les cadres de page n'ont pas besoin d'être en mémoire centrale La zone de swap est un espace disque réservé dans lequel on peut stocker des cadres de page Le noyau se charge de faire le transfert de certains cadres de page entre la mémoire centrale et la zone de swap – – En mettant en mémoire centrale les pages les plus utilisées En traitant les Page fault de manière à transferer en mémoire centrale les pages du disque ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Récupération d'une page en swap ● Parfois, un processus demande une page en swap alors que la mémoire centrale est occupée à 100% – – – – ● Le système choisie alors une page victime (de préférence une page peu demandée) Il place cette page en swap Et utilise l'espace ainsi libéré pour la page demandée Il met ensuite à jour les tables correspondantes Parfois, la page victime contient des données qui peuvent être éffacées (cache par exemple) – – Dans ce cas, le système écrase simplement le cadre avec le contenue de la page demandée Et met à jour les tables correspondantes ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Allocateur mémoire ● ● ● Le noyau s'occupe de gérer la mémoire Lorsqu'un processus a besoin de plus de mémoire, il fait une demande au noyau La demande s'effectue via un appel de la libc : – malloc() ou brk(), etc... ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Gérer le tas ● ● ● ● ● ● malloc(size) : allouer size calloc(n,size) : n éléments de taille size initialisés à0 realloc(ptr, size) : modifier la taille d'une zone allouée avec malloc ou calloc free(ptr) libérer une zone brk(addr) faire croître le tas (current->mm->brk) jusqu'à addr sbrk(incr) augmenter le tas de incr ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Appel système sys_brk(addr) ● Vérifie si addr fait partie d'une région de code → out ● Aligne addr sur une page ● Si réduction du tas, appel à do_munmap() → out ● Sinon, vérification des droits ● do_mmap() ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS do_mmap() ● Alloue une nouvelle région de mémoire – Vérifie la validité de la demande (taille, nb max de régions, droits, etc) – – Invoque get_unmapped_area() pour obtenir une adresse valide Calcule les droits (drapeaux) de la nouvelle région – Si VM_SHARED à 0, alors essaye de fusionner – Alloue une struct vm_area_struct – Remplit la structure vm_area_struct – Insère dans l'arbre des régions Renvoie la nouvelle adresse – ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS Allocation des objets du noyau ● ● ● kmem_cache_alloc() L'allocateur de Linux s'appelle SLAB et part des principes suivants : – Le type des données peut affecter la manière d'allouer la mémoire – Les fonctions du noyau demande souvent des zones de même taille (par exemple l'espace initial à création de processus) – Les demandes peuvent être classées par fréquence de demande L'allocateur fonctionne avec un système de cache, permettant d'optimiser les demande de mémoire ÉCOLE NATIONALE SUPÉRIEURE DE L'ÉLECTRONIQUE ET DE SES APPLICATIONS