0x03 – La mémoire

Cet article fait parti de la série Créer un système d'exploitation pour Raspberry Pi ( 4 / 5 )

Maintenant que nous avons une structure de projet saine, nous pouvons continuer à développer le noyau lui-même. Puisque nous sommes le noyau, théoriquement, nous pouvons utiliser n’importe quelle partie de la mémoire à tout moment. Pour imposer un peu d’ordre et éviter de nous tirer une balle dans le pied, nous devons organiser l’utilisation de cette mémoire en un système sain et clair. Le meilleur moyen de le faire est de diviser la mémoire en blocs de 4 Ko appelés pages. Les pages nous permettent d’allouer des blocs de mémoire qui ne sont pas insignifiants, mais qui ne sont pas si grands qu’ils absorbent une fraction significative de la mémoire.

Obtenir la taille de la mémoire

Si nous voulons organiser la mémoire, nous devons d’abord savoir combien de mémoire nous avons réellement. Nous pouvons le faire en accédant aux atags.

Nous pouvons faire correspondre la disposition de la mémoire des atags en définissant certains types de C:

Ensuite, nous pouvons parcourir la liste Atag jusqu’à ce que nous trouvions l’attribut MEM:

Si vous développez pour une machine virtuelle, cette fonction ne fonctionnera pas. La VM n’émule pas le bootloader qui configure les atags. Puisque vous déterminez la taille exacte de la mémoire à travers les options QEMU, vous devriez simplement avoir cette fonction pour retourner cette quantité de mémoire. Notre Makefile définit la mémoire à 128 Mo, donc cette fonction devrait retourner 1024 * 1024 * 128.

La répartition de la mémoire

Maintenant que nous pouvons obtenir la taille totale de la mémoire. Nous pouvons diviser cette mémoire en plusieurs pages. Le nombre de pages est simplement la taille de la mémoire divisée par la taille de la page.

Ces pages vont avoir besoin de métadonnées. Ils devront par exemple garder la trace s’ils ont été alloués ou non, et dans quel but. Ils auront besoin de plus de métadonnées plus tard lorsque nous activerons la mémoire virtuelle. Pour le moment, voici notre type de métadonnées:

Afin de contenir toutes les métadonnées, nous réservons une grande partie de la mémoire juste après l’image du noyau pour un tableau de métadonnées de page. Nous pouvons obtenir cette adresse en utilisant le symbole __end  que nous avons déclaré dans le script du linker. De plus, nous allons créer une liste chaînée pour garder une trace des pages qui sont libres.

Une fois cela fait, tout ce que nous devons faire est de parcourir les pages et d’initialiser leurs métadonnées et de les ajouter à la liste libre.

Voici le code:

Attribution de pages

Maintenant que nous avons toutes les pages sous contrôle, il serait bien que nous puissions allouer et libérer des pages dynamiquement. Cela peut être fait très simplement. Puisque les pages ont toujours 4 Ko, il suffit de trouver une page qui n’a pas été allouée et de renvoyer un pointeur vers la mémoire. Pour libérer, tout ce que nous devons faire est d’ajouter les métadonnées de la page à la liste libre.

Puisque les pages ont une taille constante de 4 Ko, nous pouvons obtenir la mémoire de page à partir des métadonnées de la page en multipliant l’index des métadonnées de la page par 4096. De même, nous pouvons obtenir les métadonnées de la page en divisant par 4096 cela comme un index dans le tableau de la page.

La possibilité d’allouer des pages est agréable, mais la taille stricte de 4 Ko est un peu restrictive pour la plupart des cas d’utilisation de la mémoire dynamique. Ensuite, nous allons ajouter à ce code pour implémenter un allocateur de mémoire dynamique qui peut vous donner n’importe quelle allocation à la  taille que vous voulez!

Le code est publiquement disponible sur GitHub.

Navigation<< 0x02 – Organiser notre projet0x04 – L’Allocation Dynamique >>

What do you think?

23 points
Upvote Downvote

commentaires

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

Chargement & hellip;

0x02 – Organiser notre projet

Orange : l’opérateur de l’année