Allocation de mémoire pour le noyau
Les slabs
Pour ce faire, l'implémentation utilisée dans Sos est aussi celle utilisée à partir des versions 2.4 de Linux et de Solaris :
C'est aussi l'implémentation choisie dans le projet "père" de SOS : KOS
Qu'est ce que c'est ?
La problématique a déjà été énoncée plusieurs fois : gérer des objets de petites tailles au sein d'un espace plus grand.
Les slabs sont en fait des conteneurs, des caches d'objets de différentes tailles. On crée par exemple des slabs destinés à contenir une liste d'objets occupés et libres de taille 4 octets, une autre de 8, une autre de 12, etc.
Comment les gère-t-on concrètement
Gardons à l'esprit que malgré le fait que ce soit un noyau de système d'exploitation qui soit développé, cela reste bien de la programmation, cette réponse peut donc différer selon les choix que l'on fait.
Ici, on a choisi de procéder avec les objets suivants :
- une liste de caches de slabs, ces caches contiennent chacun une liste de slabs dédiés à la gestion d'objets d'une taille donnée ;
- Chaque slab gère les objets qu'il contient et les marque comme occupé ou libéré selon l'occupation de l'espace associé.
Relations inter-objets :
Algorithmes
Ajout d'un objet : kmalloc
Lorsqu'on souhaite récupérer un objet pouvant stocker un objet de taille n, l'algorithme est alors le suivant :
- On prend la liste des caches de slabs et on cherche celle qui contient des slabs aptes à gérer des objets de taille supérieure ou égale à n. Si on a trié les listes de slabs selon la taille des objets à stocker, on garantis alors que l'espace perdu sera minimum.
- Une fois le bon cache de slabs trouvé, on regarde si le premier slab contient de la place. Sinon, on en crée un nouveau qu'on insère en tête de la liste (du cache).
- On insère ensuite le nouvel objet à allouer dans le slab en tête pour lequel on peut maintenant assurer qu'il y a de la place (cf. point précédent).
Suppression d'un objet : kfree
- On recherche le slab dans lequel est géré l'objet possédant l'adresse dont la libération est demandée ;
- On libère l'objet ;
- Si ce n'est pas un slab en tête de liste des slabs pour cette taille d'objet, on le ramène en tête puisqu'il est donc forcément plein et qu'il ne va plus l'être.