Espacio de memoria virtual del sistema Linux

  
        

Primero tome prestada una imagen en línea, siento que esto está claro:

Diagrama de diseño general del espacio de memoria virtual del sistema Linux

1.1 espacio lineal

espacio de dirección lineal: se refiere a Todo el espacio de almacenamiento virtual de 4 GB de 0x00000000 a 0xFFFFFFFF en sistemas Linux. El espacio lineal se divide en espacio de usuario y espacio de kernel.

1.1.1 Espacio de usuario (espacio de direcciones de proceso)

Espacio de usuario se refiere a un espacio de dirección lineal de 3GB de 0x00000000 a 0xBFFFFFFF. Cada proceso tiene un espacio de usuario independiente de 3GB, por lo que El espacio de usuario es único para cada proceso, pero el subproceso del núcleo no tiene espacio de usuario porque no genera direcciones de espacio de usuario. Además, el espacio hijo compartido (heredado) por el proceso hijo es solo el mismo que la dirección lineal del usuario principal en la dirección de la memoria física, en lugar del espacio compartido del usuario principal. Los usuarios que se ejecutan en modo de usuario y modo de kernel pueden acceder al espacio de usuario.

Linux utiliza tecnología de gestión de memoria virtual, cada proceso tiene un espacio de direcciones de proceso independiente de tamaño 3G, este espacio de direcciones es espacio de usuario. El espacio de usuario de cada proceso es completamente independiente e irrelevante. Cómo el proceso accede al espacio del kernel: el sistema llama e interrumpe.

Las operaciones relacionadas con el proceso, como la creación de procesos, requieren que la memoria se asigne al proceso. En este momento, el proceso no es una dirección física, sino una dirección virtual. La memoria física real es solo cuando el proceso accede a la dirección virtual recién adquirida, y luego el " mecanismo de página " genera " falta " excepción, y por lo tanto ingresa al programa que asigna el marco de página real. Esta excepción es la garantía básica de la existencia del mecanismo de memoria virtual. Le dice al kernel que asigne páginas físicas para el proceso y establezca la tabla de páginas correspondiente. Después de eso, la dirección virtual se asigna realmente a la dirección física.

1.1.2 Espacio del kernel

El espacio del kernel representa el código o los datos que se ejecutan en el nivel más alto del modo supervisor del procesador. El espacio del kernel ocupa 1 GB de linealidad desde 0xC0000000 hasta 0xFFFFFFFF. El espacio de direcciones, el espacio de direcciones lineal del kernel es compartido por todos los procesos, pero solo los procesos que se ejecutan en el estado del kernel pueden acceder. El proceso de usuario puede cambiar al estado del kernel para acceder al espacio del kernel a través de la llamada del sistema. La dirección generada cuando el proceso se ejecuta en el estado del kernel pertenece al kernel. El espacio

El espacio del kernel se puede dividir en los siguientes espacios lineales:

1. El espacio de dirección lógica del kernel

es de PAGE_OFFSET (3G) 3G + 896) El espacio de direcciones lineal es el área del mapa de memoria física del sistema que mapea la totalidad o parte de la memoria física (si el sistema contiene memoria de gama alta). La dirección en el espacio de direcciones lógicas del kernel es solo un desplazamiento fijo (3G) de la dirección correspondiente en el espacio de direcciones físico de la memoria RAM. Si el espacio de direcciones físicas de la memoria RAM se trata desde la dirección 0x00000000, entonces el desplazamiento es PAGE_OFFSET.

2. Espacio de dirección lineal de gama alta: el espacio de dirección lineal de high_memory (3G + 896M) a 0xFFFFFFFF pertenece al espacio de dirección lineal de gama alta, donde la dirección lineal entre VMALLOC_START ~ VMALLOC_END: ​​(1) es vmalloc () La función se utiliza para asignar memoria física de gama alta que es físicamente discontinua pero continua en el espacio de dirección lineal, o (2) utilizada por la función vmap () para asignar memoria física de gama alta o baja, o (3) por la función Ioremap () para reasignar I. /O espacio físico. El espacio de dirección lineal de la página LAST_PKMAP (generalmente igual a 1024) donde PKMAP_BASE comienza: utilizado por la función kmap () para asignar permanentemente la memoria física de gama alta. FIXADDR_START comienza con KM_TYPE_NR * NR_CPUS página espacio de dirección lineal: utilizado por la función kmap_atomic () para mapear temporalmente la memoria física de gama alta. Otros espacios de dirección lineal de gama alta no utilizados pueden usarse para mapear permanentemente el espacio de dirección de E /S durante la inicialización del sistema.

1.2 Espacio físico 1.2.1 Memoria de gama baja (memoria física)

La memoria física asignada por el espacio de direcciones lógicas del kernel es la memoria de gama baja (el tamaño real de la memoria física, pero menos de 896), baja La memoria final siempre tiene una dirección lógica de kernel correspondiente uno a uno permanente en el espacio de direcciones lineal de Linux. Durante el proceso de inicialización del sistema, la memoria de extremo inferior se asigna permanentemente al espacio de direcciones lógicas del kernel, y se establece una tabla de páginas de mapeo virtual para la memoria de extremo inferior. La conversión entre la dirección física y la dirección lineal de la memoria física en la memoria inferior se puede realizar con dos macros __pa (x) y __va (x), #define __pa (x) ((sin signo largo) (x) - PAGE_OFFSET) __pa (x) convierte la dirección x del espacio de direcciones lógicas del kernel en la dirección física correspondiente, que es equivalente a __virt_to_phys ((unsigned long) (x)), __va (x), por el contrario, la dirección del espacio de memoria física de gama baja Convertido a la dirección lógica del kernel correspondiente, equivalente a ((void *) __ phys_to_virt ((sin signo largo) (x)))).

1.2.2 Memoria de gama alta (memoria física)

La memoria física que está por encima de la dirección de memoria de gama baja es la memoria de gama alta (por encima de la memoria física 896), y la memoria de gama alta no está en el espacio de direcciones lineal de Linux. No hay una dirección lógica de kernel correspondiente fija fija. Durante el proceso de inicialización del sistema, la tabla de la página de asignación no se asignará al espacio de dirección lineal de Linux, pero la memoria física de gama alta se usará para la memoria física de gama alta asignada. Asigne la tabla de páginas para que pueda ser utilizada por el kernel, de lo contrario no se puede usar. La conversión de la dirección física de la memoria superior a la dirección lineal no puede usar las macros __pa (x) y __va (x) anteriores.

El origen del concepto de memoria high-end: Como se mencionó anteriormente, Linux divide el espacio de dirección lineal de 4GB en dos partes, de 0x00000000 a 0xBFFFFFFF, un espacio total de 3GB como espacio de usuario exclusivo para el proceso del usuario, esta parte del espacio de dirección lineal no Se corrigió la asignación al espacio de memoria física; espacio de dirección lineal de 4 GB de 0xC0000000 a 0xFFFFFFFF como espacio de kernel, en sistemas integrados, esta parte del espacio de dirección lineal además de mapear espacio de memoria física para asignar el espacio del registro periférico interno del procesador Espacio de E /S. El espacio de direcciones lógicas del kernel entre 0xC0000000 ~ high_memory se dedica a reparar la memoria física en el sistema de mapeo, es decir, el espacio entre 0xC0000000 ~ high_memory es el mismo que el espacio de memoria física del sistema (por supuesto, la configuración no continua de CONFIG_DISCONTIGMEMD está configurada). En el sistema de memoria, el espacio de direcciones lógicas del kernel y el espacio de la memoria física pueden tener agujeros de memoria. Si la capacidad de la memoria física en el sistema es mucho menor que 1 GB, entonces hay un high_memory ~ 0xFFFFFFFF entre el espacio de direcciones lógicas del kernel en el espacio de direcciones lineal del kernel. Hay espacio suficiente para asignar algunos espacios de E /S. Sin embargo, si la capacidad de la memoria física (incluidos los orificios de la memoria) en el sistema es superior a 1 GB, entonces no hay suficiente espacio de direcciones lineales del kernel para reparar toda la memoria física y algo de espacio de E /S del sistema de mapeo. Para resolver este problema, en el procesador x86 La plataforma establece un valor de experiencia: 896 MB, es decir, si la memoria física (incluidos los orificios de la memoria) en el sistema es mayor que 896 MB, entonces la primera memoria física de 896 MB se asigna de manera fija al espacio de direcciones lógicas del kernel 0xC0000000 ~ 0xC0000000 + 896MB (= high_memory). La memoria física después de 896 MB no establece una asignación fija al espacio de dirección lineal del kernel. Esta parte de la memoria se denomina memoria física de gama alta. En este momento, el espacio de 128 MB entre el espacio de dirección lineal del núcleo high_memory ~ 0xFFFFFFFF se denomina espacio de dirección lineal de memoria de gama alta, que se utiliza para asignar memoria física de gama alta y espacio de E /S. 896MB es el valor de la experiencia de la plataforma del procesador x86, dejando un espacio de dirección lineal de 128 MB para asignar la memoria de gama alta y el espacio de direcciones de E /S. En los sistemas integrados, este umbral se puede modificar de acuerdo con las condiciones específicas. Por ejemplo, MIPS establece este valor en 0x20000000B.
(512 MB), solo cuando la capacidad de espacio de memoria física en el sistema es mayor que 0x20000000B, el kernel debe configurar la opción CONFIG_HIGHMEM para permitir que el kernel asigne y asigne memoria de gama alta. Las condiciones para configurar la memoria física de gama alta y los umbrales de memoria física de gama alta se describen en el concepto de área de memoria anterior.

Copyright © Conocimiento de Windows All Rights Reserved