Cada proceso tiene 2 áreas de memoria: espacio de usuario (memoria alta) y espacio del kernel (memoria baja). En el espacio del kernel, ¿se utilizan los primeros 896 MB para mapear el código del kernel (no 1 GB completo)? Esto significa que, cuando una aplicación de espacio de usuario realiza una llamada al sistema o cualquier cosa relacionada con el kernel, el kernel se referirá al espacio del kernel para que se ejecute la llamada al sistema, ¿verdad?
Los 128 MB reservados en el espacio del kernel (para acceso a alta memoria (espacio de usuario)), ¿son todas las referencias del área de memoria del espacio de usuario? Entonces, un proceso del kernel puede acceder a cualquier espacio de usuario haciendo referencia a esta área, ¿es esto cierto?
Por eso esta área se llama highmem en el espacio del kernel, ¿no es así?
Respuesta1
La "memoria alta" y la "memoria baja" no se aplican al espacio de direcciones virtuales de los procesos, sino que se trata de memoria física.
En el espacio de direcciones virtuales del proceso, el espacio del usuario ocupa los primeros 3 GB y el espacio del kernel el cuarto GB de este espacio de direcciones lineal.
Los primeros 896 MB del espacio del kernel (no sólo el código del kernel, sino también sus datos) se asignan "directamente" a los primeros 896 MB de la memoria física. Es "directo" en el sentido de que siempre hay un desplazamiento de 0xc0000000 entre cualquier dirección lineal de esta parte de 896 MB del espacio del kernel virtual y su dirección correspondiente en la memoria física (tenga en cuenta, sin embargo, que la MMU está habilitada y que las entradas de la tabla de páginas en realidad son utilizado para esto).
La última parte de 128 MB del espacio del kernel virtual es donde se asignan algunas partes de la "memoria alta" física (> 896 MB): por lo tanto, sólo puede asignar no más de 128 MB de "memoria alta" a la vez.
Referencia: "Comprensión del kernel de Linux", tercera edición - secciones "8.1.3. Zonas de memoria" y "8.1.6. Asignaciones del kernel de marcos de páginas de alta memoria".
Respuesta2
Nota:-La división de memoria solo ocurre en sistemas Linux antiguos (32 bits) para obtener más detalles, consulte el comentario a continuación.
Memoria alta y baja:
- Memoria baja :Memoria para la cual existen direcciones lógicas en el espacio del kernel. En casi todos los sistemas que probablemente encontrará, toda la memoria tiene poca memoria.
- Memoria alta:Memoria para la cual no existen direcciones lógicas, porque está más allá del rango de direcciones reservado para las direcciones virtuales del kernel. Esto significa que el kernel necesita comenzar a usar asignaciones temporales de las piezas de memoria física a las que desea acceder.
El kernel divide la dirección virtual en dos partesusuarioespacio de direcciones ynúcleoespacio de dirección. El código y las estructuras de datos del kernel deben caber en ese espacio, pero el mayor consumidor de espacio de direcciones del kernel son las asignaciones virtuales para la memoria física. Por lo tanto, el kernel necesita su propia dirección virtual para cualquier memoria que deba tocar directamente. Entonces, la cantidad máxima de memoria física que podía manejar el kernel era la cantidad que podía asignarse a la porción del espacio de direcciones virtuales del kernel, menos el espacio utilizado por el código del kernel.