Croisière au coeur d'un OS Etape 3 : Gestion de la mémoire physique

Et dans Linux, comment ca marche ?

Les connaisseurs de la gestion de la mémoire physique sous Linux seront étonnés de voir que le code de SOS est si simpliste. Linux établit en effet une hiérarchie de gestionnaires de la mémoire physique à deux niveaux [1].

Au premier niveau de la hiérarchie se trouve le nécessaire pour supporter les systèmes NUMA (Non Uniform Memory Access), regroupant en particulier les systèmes distribués de type clusters [2], voire les systèmes à image unique [3]. Dans ces systèmes, chaque noeud (processeur ou multiprocesseur) a intérêt à allouer de la mémoire physique en priorité sur le noeud local. Donc Linux maintient une liste de noeuds schématiquement associés à des plages d'adresses et classés dans l'ordre de leur proximité du noeud courant.

Le deuxième niveau de la hiérarchie correspond à la gestion de la mémoire physique sur chaque noeud. Pour des raisons liées à des limitations dans la gestion de l'espace virtuel du noyau Linux (nous en reparlons dans l'article suivant), cette mémoire physique est découpée en plusieurs zones. Une zone est un intervalle d'adresses physiques contigues associé à une priorité : on allouera d'abord dans la zone de plus grande priorité. Par exemple, sur le noeud courant, il y a 3 zones.

Dans l'ordre des priorités décroissantes : de 16 Mo à 896 Mo pour les adresses physiques courantes, de 0 à 16 Mo pour le DMA (principalement sur bus ISA), puis de 896 Mo à 4 Go ou 64 Go pour la zone "highmem". La gestion de la mémoire dans chaque zone repose sur un allocateur simple de type "buddy system" [1, Chapitre 7] dont nous reparlerons dans l'article 5.

Dans SOS, d'une part la gestion du NUMA n'est pas envisagée, donc la hiérarchie de premier niveau (les noeuds) n'apparaît pas. Et d'autre part nous ne découpons pas la gestion de la mémoire en gestionnaires de zones. En effet, notre gestion de la mémoire virtuelle, que nous verrons dans l'article suivant, permet de modifier librement et dynamiquement les pages physiques occupées par le noyau. Ceci nous permettra par exemple de réquisitionner au vol des pages physiques dans la zone 0-16Mo (DMA sur bus ISA), même si elles sont utilisées par le noyau.

Valid XHTML 1.0!