[LINUX] Verwaltung des Startzeitspeichers

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.

Unmittelbar nach dem Start der Systeminitialisierung ist ein regulärer Speichermanager einfach nicht verfügbar, da er noch nicht bereit ist. Sie müssen jedoch Speicher für verschiedene Datenstrukturen zuweisen, z. B. für den physischen Seitenzuweiser.

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.

Ein spezieller Allokator namens memblock führt beim Start die Speicherverwaltung durch. Für die architekturspezifische Initialisierung ist setup_arch () erforderlich, um sie festzulegen, und die Funktion mem_init (), um sie zu zerstören.

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.

Sobald die frühe Speicherverwaltung aktiviert ist, werden verschiedene Funktionen und Makros für die Speicherzuweisung aktiviert. Die Zuordnung wird an den ersten (und wahrscheinlich einzigen) Knoten oder einen bestimmten Knoten im NUMA-System gesendet. Einige APIs geraten in Panik, wenn die Zuordnung fehlschlägt, andere nicht.

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

Memblock bietet auch verschiedene APIs zur Steuerung des Selbstvertrauensverhaltens.

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 ist eine Methode zum Verwalten des Speicherbereichs in der frühen Startphase, wenn die Kernel-Speicherzuordnung normalerweise nicht startet oder funktioniert.

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

Memblock sieht System Memroy als eine Reihe zusammenhängender Regionen. Es gibt verschiedene Arten dieser Sets.

・ Speicher - Beschreibt den dem Kernel zur Verfügung stehenden physischen Speicher. Dieser kann vom tatsächlich im System installierten physischen Speicher abweichen, z. B. wenn der Speicher mit dem Befehlszeilenparameter mem = eingeschränkt ist ・ Reserviert - beschreibt die Regionen, die zugewiesen wurden ・ Physmap - beschreibt den tatsächlichen physischen Speicher unabhängig von den möglichen Einschränkungen. Der Physmap-Typ ist nur auf einigen Architekturen verfügbar.

· Speicher - Beschreibt den physischen Speicher für den Kernel. Dieser kann vom tatsächlich im System installierten physischen Speicher abweichen. Zum Beispiel, wenn es durch den Befehlszeilenparameter mem = eingeschränkt ist. -Reserviert-Beschreiben Sie eine Region, die bereits zugeordnet ist. • physmap - Beschreibt den tatsächlichen physischen Speicher, unabhängig von möglichen Grenzen. Der Physmap-Typ ist nur auf einigen Architekturen verfügbar.

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.

Jede Region wird durch die Struktur memblock_region dargestellt, die den Regionsbereich, seine Attribute und die NUMA-Knoten-ID im NUMA-System definiert. Alle Speichertypen werden durch struct memblock_type beschrieben. Es enthält ein Array von Speicherbereichen sowie Allokator-Metadaten. Der Speichertyp umschließt den Struktur-Memblock gut. Diese Struktur wird beim Start statisch initialisiert.

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.

Die Typen "Speicher" und "reserviert" des Regionsarrays werden auf die Größe von INIT_MEMBLOCK_REGIONS initialisiert, und der Typ "physmap" ist INIT_PHYSMEM_REGIONS. memblock_allow_resize () ändert automatisch die Größe des Regionsarrays, während neue Regionen hinzugefügt werden. Diese Funktion muss darauf achten, dass sich der dem Regionsarray zugewiesene Speicher nicht mit den Regionen überschneidet, die reserviert werden müssen, z. B. 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.

Frühe Architektur-Setups müssen die Funktionen memblock_add () oder memblock_add_node () verwenden, um memblock über das Layout des physischen Speichers zu informieren. Die erste Funktion weist dem NUMA-Knoten, der für UMA-Systeme geeignet ist, keinen Speicherplatz zu. Ich bin. Es ist jedoch auch im NUMA-System verfügbar. Weisen Sie einen NUMA-Knoten zu, nachdem Sie den Setup-Vorgang mit memblock_set_node () ausgeführt haben. Der memblock_add_node () nimmt eine solche Zuweisung direkt vor.

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

Sobald der Speicher mit memblock eingerichtet ist, können Sie den Speicher mithilfe einer der API-Varianten zuweisen.

・ Memblock_phys_alloc * () - Diese Funktionen geben die physikalische Adresse des zugewiesenen Speichers zurück -Memblock_alloc * () - Diese Funktionen geben die virtuelle Adresse des zugewiesenen Speichers zurück.

-Memblock_phys_alloc * () - Diese Funktionen geben den Speicher mit der zugewiesenen physischen Adresse als Rückgabewert zurück. · Memblock_alloc * () - Diese Funktionen geben die virtuelle Adresse des zugewiesenen Speichers zurück.

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.

Beachten Sie, dass beide API-Varianten einen impliziten Prozess für den zulässigen Speicherbereich und die Fallback-Mittel verwenden. Eine ausführlichere Beschreibung finden Sie in der Funktionsdokumentation memblock_alloc_internal) und memblock_alloc_range_nid).

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

Während des Systemstartfortschritts gibt die architekturspezifische Funktion mem_init () den gesamten Speicher für den Buddy-Seitenzuweiser frei.

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

Sofern die Architektur CONFIG_ARCH_KEEP_MEMBLOCK nicht aktiviert, wird die Memblock-Datenstruktur nach Abschluss der Systeminitialisierung zerstört.

Recommended Posts

Verwaltung des Startzeitspeichers
Speicherverwaltung »Konzeptübersicht
[Übersetzung] Spark Memory Management seit 1.6.0
[OS / Linux] Prozess-, Thread-, Speicherverwaltung