Método de asignación de memoria de gama alta de Linux

  
        

1.1 Distribución del espacio de direcciones del kernel (espacio lineal)

(1) Área de asignación directa: El intervalo máximo de 896M desde 3G en el espacio lineal, que es el área de asignación de memoria directa, la dirección lineal y la dirección física del área. Existe una relación de conversión lineal: dirección lineal = dirección física 3G +.

(2) Área de mapeo de memoria dinámica: esta área es asignada por la función de núcleo vmalloc. La característica es que el espacio lineal es continuo, pero el espacio físico correspondiente no es necesariamente continuo. La página física correspondiente a la dirección lineal asignada por vmalloc puede estar en la memoria de gama baja o en la memoria de gama alta.

(3) Área de mapa de memoria permanente: esta área puede acceder a la memoria de gama alta. El método de acceso es asignar una página de memoria de gama alta utilizando alloc_page (_GFP_HIGHMEM) o usar la función kmap para asignar la memoria de gama alta asignada al área.

(4) Área de asignación fija: esta área y la parte superior de 4G solo tienen una banda de aislamiento de 4k, y cada elemento de dirección tiene un propósito específico, como ACPI_BASE.

Descripción:

Tenga en cuenta que el espacio de usuario puede, por supuesto, usar memoria de gama alta, y es de uso normal. El kernel usa espacio de memoria de gama alta (si existe) cuando se asigna memoria que no se usa con frecuencia. El llamado uso infrecuente es relativamente relativo. Por ejemplo, algunas estructuras de datos del núcleo se utilizan con frecuencia y algunos datos del usuario se utilizan con poca frecuencia. Cuando un usuario inicia una aplicación, necesita memoria y cada aplicación tiene una dirección lineal 3G. Al asignar la tabla de páginas a estas direcciones, puede utilizar directamente la memoria de gama alta.

Y una cosa más que corregir es que la dirección lineal 128M no solo se usa en estos lugares. Si desea cargar un dispositivo que necesita asignar su memoria al kernel, también debe usar esto. Segmentar el espacio de dirección lineal para completar, de lo contrario el núcleo no puede acceder al espacio de memoria en el dispositivo.

En resumen, la dirección lineal de gama alta del kernel es para acceder a recursos de memoria que no sean la asignación fija del kernel. Cuando un proceso usa memoria, activa una excepción de error de página. Es una cuestión para el kernel asignar específicamente qué páginas físicas al proceso del usuario. No hay ningún concepto de memoria de gama alta en el espacio de usuario.

1.2 Asignación de memoria de gama alta

La asignación de memoria de gama alta significa: asignación de un espacio de dirección lineal (que va desde PAGE_OFFSET + 896M hasta los últimos 128M de 4G) hasta un marco de página física por encima de 896M. Como se muestra a continuación:

Hay tres formas de almacenar la memoria de gama alta (ambas asignaciones indirectas):

1.2.1 Asignación a " espacio de asignación dinámica del kernel " (asignación de área de memoria no contigua)

Este método es muy simple, porque vmalloc (), en el kernel "espacio de mapeo dinámico" al solicitar memoria, es posible obtener la página de la memoria de gama alta (consulte la implementación de vmalloc), por lo que la memoria de gama alta Es posible asignar a " espacio dinámico de mapeo del kernel ".

1.2.2 Asignación permanente de kernel

Si obtiene una página correspondiente a la memoria de gama alta a través de alloc_page (), ¿cómo encuentra un espacio lineal para ella?

Deje un espacio lineal de PKMAP_BASE a FIXADDR_START para asignar la memoria de gama alta. En el kernel 2.4, este rango de direcciones está entre 4G-8M y 4G-4M. Este espacio comienza con "espacio de mapeo permanente del kernel" o "espacio de mapeo del kernel permanente". Este espacio utiliza la misma tabla de directorio de páginas que otros espacios. Para el kernel, es swapper_pg_dir, para procesos normales, a través del registro CR3. Punto Normalmente, este espacio tiene un tamaño de 4 M, por lo que solo se necesita una tabla de páginas, y el núcleo busca esta tabla de páginas yendo a pkmap_page_table. Con kmap (), puede asignar una página a este espacio. Dado que este espacio tiene un tamaño de 4M, puede asignar hasta 1024 páginas al mismo tiempo. Por lo tanto, para una página que no se usa, y cuando debería liberarse desde este espacio (es decir, la relación de mapeo), se puede usar kunmap () para liberar la dirección lineal correspondiente a una página desde este espacio. La asignación de memoria permanente permite la asignación a largo plazo.

1.2.3 Mapeo temporal

El kernel reserva algo de espacio lineal entre FIXADDR_START y FIXADDR_TOP para necesidades especiales. Este espacio se denomina "espacio de mapeo fijo"; en este espacio, hay una parte del mapeo temporal para la memoria de gama alta.

Este espacio tiene las siguientes características:

1. Cada CPU ocupa un espacio

2. En el espacio ocupado por cada CPU, se divide en múltiples Un espacio pequeño, cada espacio pequeño es de 1 página, cada espacio pequeño se usa para un propósito, estos propósitos se definen en km_type en kmap_types.h. Cuando se debe realizar un mapeo temporal, se debe especificar el propósito del mapeo. De acuerdo con el propósito del mapeo, se puede encontrar el pequeño espacio correspondiente, y luego se utiliza la dirección del espacio como la dirección del mapeo. Esto significa que una asignación temporal hará que la asignación anterior se sobrescriba.

El mapeo temporal se logra con kmap_atomic (). Puede ser utilizado dentro del controlador de interrupción y la función de retardo, nunca bloqueando. Debido a que el mapa de memoria temporal es parte de un mapa de memoria fijo, una dirección es fija para ser utilizada por un componente del kernel.

Copyright © Conocimiento de Windows All Rights Reserved