GNU/Linux >> Tutoriales Linux >  >> Linux

¿Qué son la memoria alta y la memoria baja en Linux?

En una arquitectura de 32 bits, el rango del espacio de direcciones para direccionar la RAM es:

0x00000000 - 0xffffffff

o 4'294'967'295 (4GB).

El kernel de Linux lo divide en 3/1 (también podría ser 2/2 o 1/3) en espacio de usuario (memoria alta) y espacio del kernel (memoria baja) respectivamente.

El rango de espacio de usuario:

0x00000000 - 0xbfffffff

Cada proceso de usuario recién generado obtiene una dirección (rango) dentro de esta área. Los procesos de usuario generalmente no son de confianza y, por lo tanto, tienen prohibido acceder al espacio del núcleo. Además, se consideran no urgentes, como regla general, el kernel intenta diferir la asignación de memoria a esos procesos.

El rango de espacio del núcleo:

0xc0000000 - 0xffffffff

Un proceso del kernel obtiene su dirección (rango) aquí. El núcleo puede acceder directamente a este 1 GB de direcciones (bueno, no al 1 GB completo, hay 128 MB reservados para el acceso a la memoria alta).

Los procesos generados en el espacio del kernel son confiables, urgentes y se supone que no tienen errores, la solicitud de memoria se procesa instantáneamente.

Cada proceso del kernel también puede acceder al rango de espacio del usuario si así lo desea. Y para lograr esto, el kernel asigna una dirección desde el espacio del usuario (la memoria alta) a su espacio del kernel (la memoria baja), los 128 MB mencionados anteriormente están especialmente reservados para esto.

El CONFIG_VMSPLIT_... controla si la división es 3/1, 2/2 o 1/3. opción; probablemente puedas comprobar en /boot/config* para ver qué opción se seleccionó para su kernel.


La primera referencia a la que acudir es Controladores de dispositivos Linux (disponible tanto en línea como en forma de libro), particularmente el capítulo 15 que tiene una sección sobre el tema.

En un mundo ideal, cada componente del sistema podría asignar toda la memoria a la que necesita acceder. Y este es el caso de los procesos en Linux y la mayoría de los sistemas operativos:un proceso de 32 bits solo puede acceder a un poco menos de 2^32 bytes de memoria virtual (de hecho, alrededor de 3 GB en una arquitectura típica de Linux de 32 bits). Se vuelve difícil para el kernel, que necesita poder mapear la memoria completa del proceso cuya llamada al sistema se está ejecutando, más toda la memoria física, más cualquier otro dispositivo de hardware mapeado en la memoria.

Entonces, cuando un kernel de 32 bits necesita mapear más de 4 GB de memoria, debe compilarse con un alto soporte de memoria. La memoria alta es la memoria que no está asignada permanentemente en el espacio de direcciones del kernel. (La memoria baja es lo contrario:siempre está asignada, por lo que puede acceder a ella en el kernel simplemente eliminando la referencia de un puntero).

Cuando accede a la memoria alta desde el código del kernel, debe llamar a kmap primero, para obtener un puntero de una estructura de datos de página (struct page ). Llamando a kmap funciona ya sea que la página esté en memoria alta o baja. También hay kmap_atomic que tiene restricciones adicionales pero es más eficiente en máquinas multiprocesador porque utiliza un bloqueo de grano más fino. El puntero obtenido a través de kmap es un recurso:consume espacio de direcciones. Una vez que hayas terminado con él, debes llamar al kunmap (o kunmap_atomic ) para liberar ese recurso; entonces el puntero ya no es válido y no se puede acceder al contenido de la página hasta que llame a kmap de nuevo.


Esto es relevante para el kernel de Linux; No estoy seguro de cómo cualquier kernel de Unix maneja esto.

High Memory es el segmento de memoria que pueden abordar los programas de espacio de usuario. No puede tocar Memoria baja.

Low Memory es el segmento de memoria que el kernel de Linux puede abordar directamente. Si el kernel debe acceder a High Memory, primero debe asignarlo a su propio espacio de direcciones.

Recientemente se introdujo un parche que le permite controlar dónde está el segmento. La compensación es que puede quitar la memoria direccionable del espacio del usuario para que el kernel pueda tener más memoria que no tiene que asignar antes de usar.

Recursos adicionales:

  • http://tldp.org/HOWTO/KernelAnalysis-HOWTO-7.html
  • http://linux-mm.org/HighMemory

Linux
  1. Linux:¿qué son la memoria alta y la memoria baja en Linux?

  2. Linux:¿los diferentes kernels de Linux/unix son intercambiables?

  3. ¿En qué idiomas están escritos Windows, Mac OS X y Linux?

  4. ¿Qué caracteres están prohibidos en los nombres de directorio de Windows y Linux?

  5. Depuración en vivo del kernel de Linux, ¿cómo se hace y qué herramientas se utilizan?

Linux Kernel 5.9:Novedades y cómo actualizar

Qué son los Snaps y cómo instalarlos en varias distribuciones de Linux

¿Qué son los registros de Linux y dónde encontrarlos?

Kernel de Linux y sus funciones

Qué hacer en caso de pánico en el kernel de Linux

Segmentación de memoria de Linux