[LINUX] Gestion de la mémoire au démarrage

https://www.kernel.org/doc/html/latest/core-api/boot-time-mm.html

Boot time memory management

Early system initialization cannot use “normal” memory management simply because it is not set up yet. But there is still need to allocate memory for various data structures, for instance for the physical page allocator.

Immédiatement après le démarrage de l'initialisation du système, un gestionnaire de mémoire standard n'est tout simplement pas disponible, car il n'est pas encore prêt. Cependant, vous devez allouer de la mémoire pour diverses structures de données, par exemple, l'allocateur de page physique.

A specialized allocator called memblock performs the boot time memory management. The architecture specific initialization must set it up in setup_arch() and tear it down in mem_init() functions.

Un allocateur spécial appelé memblock effectue la gestion de la mémoire au démarrage. L'initialisation spécifique à l'architecture nécessite setup_arch () pour le définir et la fonction mem_init () pour le détruire.

Once the early memory management is available it offers a variety of functions and macros for memory allocations. The allocation request may be directed to the first (and probably the only) node or to a particular node in a NUMA system. There are API variants that panic when an allocation fails and those that don’t.

Une fois que la gestion précoce de la mémoire est activée, diverses fonctions et macros d'allocation de mémoire seront activées. L'allocation est envoyée au premier (et probablement le seul) nœud ou à un nœud spécifique du système NUMA. Certaines API paniqueront lorsque l'allocation échouera, tandis que d'autres ne le feront pas.

Memblock also offers a variety of APIs that control its own behaviour.

Memblock fournit également diverses API pour contrôler le comportement de confiance en soi.

Memblock Overview

Memblock is a method of managing memory regions during the early boot period when the usual kernel memory allocators are not up and running.

Memblock est une méthode de gestion de la région mémoire au début de la période de démarrage lorsque l'allocation de mémoire du noyau ne démarre pas ou ne fonctionne normalement pas.

Memblock views the system memory as collections of contiguous regions. There are several types of these collections:

Memblock voit le système memroy comme un ensemble de régions contiguës. Il existe plusieurs types de ces ensembles.

・ Mémoire - décrit la mémoire physique disponible pour le noyau; cela peut différer de la mémoire physique réelle installée dans le système, par exemple lorsque la mémoire est limitée avec le paramètre de ligne de commande mem = ・ Réservé - décrit les régions qui ont été attribuées ・ Physmap - décrit la mémoire physique réelle quelles que soient les restrictions possibles; le type physmap n'est disponible que sur certaines architectures.

· Mémoire: décrit la mémoire physique du noyau, qui peut différer de la mémoire physique réellement installée dans le système. Par exemple, s'il est limité par le paramètre de ligne de commande mem =. -Réservé-Décrivez une région qui est déjà allouée. • physmap: décrit la mémoire physique réelle, quelles que soient les limites possibles. Le type physmap n'est disponible que sur certaines architectures.

Each region is represented by struct memblock_region that defines the region extents, its attributes and NUMA node id on NUMA systems. Every memory type is described by the struct memblock_type which contains an array of memory regions along with the allocator metadata. The memory types are nicely wrapped with struct memblock. This structure is statically initialzed at build time.

Chaque région est représentée par la structure memblock_region, qui définit la plage de régions, ses attributs et l'identifiant de nœud NUMA dans le système NUMA. Tous les types de mémoire sont décrits par struct memblock_type. Il contient un tableau de régions mémoire, ainsi que des métadonnées d'allocateur. Le type de mémoire enveloppe joliment le memblock de structure. Cette structure est initialisée statiquement au démarrage.

The region arrays for the “memory” and “reserved” types are initially sized to INIT_MEMBLOCK_REGIONS and for the “physmap” type to INIT_PHYSMEM_REGIONS. The memblock_allow_resize() enables automatic resizing of the region arrays during addition of new regions. This feature should be used with care so that memory allocated for the region array will not overlap with areas that should be reserved, for example initrd.

Les types "mémoire" et "réservé" du tableau de régions sont initialisés à la taille de INIT_MEMBLOCK_REGIONS, et le type "physmap" est INIT_PHYSMEM_REGIONS. memblock_allow_resize () redimensionnera automatiquement le tableau de régions pendant que de nouvelles régions sont ajoutées. Cette fonctionnalité doit veiller à ce que la mémoire allouée au tableau de régions ne chevauche pas les régions qui doivent être réservées, par exemple initrd.

The early architecture setup should tell memblock what the physical memory layout is by using memblock_add() or memblock_add_node() functions. The first function does not assign the region to a NUMA node and it is appropriate for UMA systems. Yet, it is possible to use it on NUMA systems as well and assign the region to a NUMA node later in the setup process using memblock_set_node(). The memblock_add_node() performs such an assignment directly.

La configuration initiale de l'architecture doit utiliser les fonctions memblock_add () ou memblock_add_node () pour notifier memblock de la disposition de la mémoire physique, la première fonction n'alloue pas d'espace au nœud NUMA, ce qui convient aux systèmes UMA Je suis. Cependant, il est également disponible dans le système NUMA. Attribuez un nœud NUMA après avoir exécuté le processus de configuration à l'aide de memblock_set_node (). Le memblock_add_node () effectue directement une telle affectation.

Once memblock is setup the memory can be allocated using one of the API variants:

Une fois la mémoire configurée avec memblock, vous pouvez allouer la mémoire en utilisant l'une des variantes d'API.

・ Memblock_phys_alloc * () - ces fonctions renvoient l'adresse physique de la mémoire allouée -Memblock_alloc * () - ces fonctions renvoient l'adresse virtuelle de la mémoire allouée.

-Memblock_phys_alloc * () -Ces fonctions renvoient la mémoire avec l'adresse physique allouée comme valeur de retour. · Memblock_alloc * () - Ces fonctions renvoient l'adresse virtuelle de la mémoire allouée.

Note, that both API variants use implict assumptions about allowed memory ranges and the fallback methods. Consult the documentation of memblock_alloc_internal() and memblock_alloc_range_nid() functions for more elaborate description.

Notez que les deux variantes d'API utilisent un processus implicite pour la plage de mémoire autorisée et les moyens de secours. Voir la documentation des fonctions memblock_alloc_internal) et memblock_alloc_range_nid) pour une description plus détaillée.

As the system boot progresses, the architecture specific mem_init() function frees all the memory to the buddy page allocator.

Pendant la progression du démarrage du système, la fonction mem_init () spécifique à l'architecture libère toute la mémoire pour l'allocateur de page d'amis.

Unless an architecture enables CONFIG_ARCH_KEEP_MEMBLOCK, the memblock data structures will be discarded after the system initialization completes.

À moins que l'architecture n'active CONFIG_ARCH_KEEP_MEMBLOCK, la structure de données fictive sera détruite une fois l'initialisation du système terminée.

Recommended Posts

Gestion de la mémoire au démarrage
Gestion de la mémoire »Présentation des concepts
[Français] Spark Memory Management depuis 1.6.0
[OS / Linux] Processus, thread, gestion de la mémoire