in , , ,

0x04 – L’Allocation Dynamique

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

Afin d’allouer plus de mémoire que 4Kb, nous avons besoin d’allouer de la memoire en premier lieu! Puisque nous sommes le noyau, nous sommes le patron. Nous pouvons réserver la mémoire directement après les métadonnées de la page et la réserver pour notre pile de données . La taille à réserver est quelque peu arbitraire, donc nous choisissons 1 Mo parce que c’est assez spatieux pour être suffisant pour les besoins de la mémoire dynamique du noyau, et assez petit pour qu’il n’utilise pas une partie significatif de la mémoire que le code utilisateur pourrait utiliser.

Maintenant que nous avons une partie de la mémoire, tout ce dont nous avons besoin est une fonction pour la diviser! Nous allons exposer l’interface familière void * malloc (uint32_t octets)  dans les fichiers src/kernel/mem.c  et include/kernel/mem.h . Nous allons associer chaque allocation à un en-tête. Les en-têtes formeront une liste chaînée, afin que nous puissions facilement parcourir à partir du début d’une allocation à l’autre. Il comprendra également une taille, et si l’allocation est actuellement en cours d’utilisation. Voici la définition de la structure d’en-tête:

Pour attribuer la mémoire, tout ce que nous devons faire est de trouver l’allocation qui correspond le mieux au nombre d’octets demandés et qui n’est pas utilisé. Si cette allocation est très importante, nous pouvons diviser cette allocation en deux plus petites, et n’utiliser que l’une d’entre elles. Le critère que nous avons utilisé pour déterminer si une allocation doit être fractionnée est si l’allocation est au moins deux fois la taille d’un en-tête. Une fois que nous avons une allocation, nous retournons un pointeur vers la mémoire directement après l’en-tête. Voici le code:

Libérer la mémoire

Maintenant que nous avons malloc , naturellement nous avons besoin de free  afin que nous ne remplissions pas notre 1 Mo avec des données qui ne seront plus utilisées. De toute évidence, nous devons marquer les allocations inutilisées, de sorte qu’un autre appel à malloc  pourra réattribuer. En outre, nous devons fusionner les allocations libres adjacentes en une seule. Voici le code:

Initialiser le stack

Maintenant que nous avons les algorithmes pour attribuer et libérer, nous devons initialiser le stack. Pour cela, nous devons réserver les pages que nous allons utiliser, mettre un en-tête au début de notre allocation de 1 Mo qui indique qu’il y a une allocation inutilisée de 1 Mo, et assigner heap_segment_list_head  à cet en-tête. Enfin, nous devons appeler cette fonction d’initialisation dans kernel_main . Voici le code:

Le code est publiquement disponible sur GitHub.

Navigation<< 0x03 – La mémoire

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.

GIPHY App Key not set. Please check settings

Chargement & hellip;

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

Google supprime «Kodi» des suggestions de recherche