Notas personales sobre Linux Virtual Memory Management

  
 

Hace unos días, simplemente pasé por el "Entendimiento de la gestión de la memoria del kernel de Linux". El texto es muy corto y no es fácil de leer. Es un libro que se lee con frecuencia.趁 La impresión aún es buena para tomar nota primero, el contenido es más personal, no hay nada que entender, perdóneme: p

『Administración de memoria』 es en realidad una palabra muy amplia, administración de páginas físicas, administración de tablas de páginas, administración de espacios de direcciones , asignación de memoria, etc., cada una de cada pieza puede llamarse "gestión de memoria", pero la diferencia entre ellas es enorme, con una palabra para cubrir el pasado, es como una persiana, no ver el bosque. Para entender su cuadro completo, es mejor discutirlo por separado. Si puedes descubrir cada parte, no verás la imagen completa.

Inicialización del sistema y diseño de memoria

En la fase de inicio (setup.o), el kernel asignará primero dos tablas de páginas temporales a las dos primeras entradas del directorio de páginas swapper_pg_dir ^ 1, que será de 0 a 8 m. La dirección virtual de 3g ~ 3g + 8m se asigna a la dirección física de 0 ~ 8m al mismo tiempo.

La inicialización de la tabla de páginas del kernel se encuentra en la función kernel_physical_mapping_init () en la fase de inicialización del kernel. Si es posible, use PSE para configurar páginas grandes, use PGE para configurar la página global, arregle el mapa de memoria en el TLB y no necesita actualizar nuevamente cuando cambie el espacio de direcciones.

Linux corrige el espacio de direcciones del kernel de mapeo. En las máquinas x86, la memoria física se divide en 3 zonas: ◦ZONE_DMA: 0 ~ 16m◦ZONE_NORMAL: 16m ~ 896m◦ZONE_HIGHMEM: 896m ~

donde ZONE_DMA y ZONE_NORMAL se asignan de forma fija a 0xc000000, el resto El espacio de direcciones de 128 MB se usa para asignar páginas físicas en ZONE_HIGHMEM o FIXMAP.

En x64, el espacio de direcciones es suficiente para asignar toda la memoria física, ZONE_HIGHMEM está vacío.

kmap

Para usar la memoria en ZONE_HIGHMEM en el kernel, primero debe asignarla al espacio de direcciones del kernel a través de kmap ().

Pero kmap () puede irse a dormir, y debes usar kmap_atomic () en el contexto de interrupción.

Buddy Allocator y administración de página física

En Linux, Buddy Allocator se utiliza como asignador de memoria a nivel de página para páginas físicas contiguas de 2 potencias. Actúa como un asignador de memoria del kernel y un backend para la caché de página.

La rutina relacionada es alloc_pages (gfp_t gfp_mask, sin firma int), que devuelve una lista enlazada de estructuras de página.

Cómo hacer un buffer de rebote de recursos limitados: la memoria DMA es limitada, espacio para el ciclo de vida; ◦kmap_atomic (): los elementos de la tabla de páginas reservadas están limitados, tan pronto como sea posible, lo más pronto posible.

NUMA y Nodo

En los sistemas SMP, cuando las CPU aumentan, el acceso indiscriminado a la memoria se convierte en un cuello de botella que afecta la escalabilidad ^ 2. La solución para esto es proporcionar una pieza de memoria separada para cada procesador. En principio, el procesador solo accede a la memoria cerca de sí mismo, lo que aumenta la escalabilidad del acceso a la memoria. Esto es NUMA (acceso de memoria no uniforme), donde cada procesador y memoria se denominan colectivamente Nodo.

Y lo que el kernel debe hacer es asignar solo la memoria en este nodo cuando la CPU asigna memoria. En Linux, la estructura del nodo es pg_data_t.

Asignación de memoria de losa y kernel

Para usar la memoria en el kernel, use Slab. Utiliza el asignador de amigos como extremo posterior, y la aplicación para bloques grandes de memoria se divide en bloques pequeños, cada uno de los cuales es un bloque de memoria grande. ◦kmem_cache_alloc () y kmem_cache_free (), un asignador de memoria dedicado para asignar estructuras comúnmente utilizadas en el kernel. ◦kmalloc () y kfree (), un asignador de memoria genérico. Detrás hay un conjunto de losas de diferentes tamaños.

Si la asignación /liberación de estructuras no es particularmente frecuente, generalmente es suficiente usar solo kmalloc ().

Administración de la tabla de páginas

La tabla de páginas de tres niveles de x86 linux está realmente preparada para PAE. Si tiene una máquina de 64 bits, debe tener cuatro niveles.

notas misceláneas◦struct address_space El nombre es engañoso. De hecho, la estructura que describe el espacio de direcciones del usuario en el kernel es struct mm_struct. La estructura struct address_space es más como una descripción de la caché de página. ◦GFP es una abreviatura de Get Free Page.

Copyright © Conocimiento de Windows All Rights Reserved