¿Cómo gestiona el kernel de Linux menos de 1GB de memoria física?


Estoy aprendiendo el funcionamiento interno del kernel de Linux y mientras leía "Entendiendo el Kernel de Linux", me impactaron bastantes preguntas relacionadas con la memoria. Uno de ellos es, cómo el kernel de Linux maneja el mapeo de memoria si la memoria física de digamos solo 512 MB está instalada en mi sistema.

Como he leído, el kernel asigna 0(o 16) MB-896MB RAM física a la dirección lineal 0xC0000000 y puede direccionarla directamente. Por lo tanto, en el caso descrito anteriormente donde solo tengo 512 MB:

  • Cómo ¿puede el núcleo asignar 896 MB de solo 512 MB ? En el esquema descrito, el kernel configura las cosas para que las tablas de páginas de cada proceso mapeen direcciones virtuales de 0xC0000000 a 0xFFFFFFFF (1GB) directamente a direcciones físicas de 0x00000000 a 0x3FFFFFFF (1GB). Pero cuando solo tengo 512 MB de RAM física, ¿cómo puedo mapear direcciones virtuales de 0xC0000000-0xFFFFFFFF a físicas 0x00000000-0x3FFFFFFF ? El punto es que tengo un rango físico de solo 0x00000000-0x20000000.

  • ¿Qué pasa con procesos de modo de usuario en esta situación?

  • Cada artículo explica solo la situación, cuando se han instalado 4 GB de memoria y el núcleo asigna los 1 GB en el espacio del núcleo y los procesos de usuario utiliza la cantidad restante de RAM.

Agradecería cualquier ayuda para mejorar mi comprensión.

Gracias..!

Author: TheLoneJoker, 2010-12-25

5 answers

No todas las direcciones virtuales (lineales) deben ser mapeadas a cualquier cosa. Si el código accede a la página sin asignar, el error de página aumenta.

La página física se puede asignar a varias direcciones virtuales simultáneamente.

En la memoria virtual de 4 GB hay 2 secciones: 0x0... 0xbfffffff-es el proceso de memoria virtual y 0xc0000000 .. 0xffffffff es una memoria virtual del núcleo.

  • ¿Cómo puede el núcleo asignar 896 MB de solo 512 MB ?

Mapea hasta 896 MB. Entonces, si solo tiene 512, solo habrá 512 MB mapeados.

Si su memoria física está en 0x00000000 a 0x20000000, se asignará para el acceso directo del núcleo a las direcciones virtuales 0xC0000000 a 0xE0000000 (asignación lineal).

  • ¿Qué pasa con los procesos en modo usuario en esta situación?

La memoria Phys para los procesos de usuario se mapeará (no secuencialmente sino más bien aleatoriamente de página a página) a direcciones virtuales 0x0 .... 0xc0000000. Este mapeo será el segundo asignación de páginas desde 0..896MB. Las páginas serán tomadas de listas de páginas libres.

  • ¿Dónde están los procesos en modo usuario en phys RAM?

En cualquier lugar.

  • Cada artículo explica solo la situación, cuando has instalado 4 GB de memoria y el

No. Cada artículo explica cómo se asignan 4 Gb de espacio de direcciones virtuales. El tamaño de la memoria virtual es siempre de 4 GB (para máquinas de 32 bits sin extensiones de memoria como PAE / PSE / etc para x86)

Como se indica en 8.1.3. Memory Zones del libro Linux Kernel Development de Robert Love (uso la tercera edición), hay varias zonas de memoria física:

  • ZONE_DMA-Contiene marcos de página de memoria por debajo de 16 MB
  • ZONE_NORMAL-Contiene marcos de página de memoria en y por encima de 16 MB y por debajo de 896 MB
  • ZONE_HIGHMEM-Contiene marcos de página de memoria en y por encima de 896 MB

Entonces, si tienes 512 MB, tu ZONE_HIGHMEM estará vacío, y ZONE_NORMAL tendrá 496 MB de memoria física asignada.

También, echa un vistazo a 2.5.5.2. Final kernel Page Table when RAM size is less than 896 MB sección del libro. Se trata de caso, cuando usted tiene menos memoria de 896 MB.

También, para ARM hay alguna descripción del diseño de la memoria virtual: http://www.mjmwired.net/kernel/Documentation/arm/memory.txt

La línea 63 PAGE_OFFSET high_memory-1 es la parte mapeada directa de la memoria

 43
Author: osgx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-21 06:20:32

El hardware proporciona una Unidad de Gestión de Memoria . Es una pieza de circuito que es capaz de interceptar y alterar cualquier acceso a la memoria. Cada vez que el procesador accede a la RAM, por ejemplo, para leer la siguiente instrucción a ejecutar, o como un acceso a datos activado por una instrucción, lo hace en alguna dirección que es, en términos generales, un valor de 32 bits. Una palabra de 32 bits puede tener un poco más de 4 mil millones de valores distintos, por lo que hay un espacio de direcciones de 4 GB: ese es el número de bytes que podrían tener una dirección única.

Así que el procesador envía la solicitud a su subsistema de memoria, como "obtener el byte en la dirección x y devolvérmelo". La solicitud pasa por la MMU, que decide qué hacer con la solicitud. La MMU divide virtualmente el espacio de 4 GB en páginas ; el tamaño de página depende del hardware que utilice, pero los tamaños típicos son de 4 y 8 kB. La MMU utiliza tablas que le indican qué hacer con los accesos para cada página: o bien el acceso es concedido con una dirección reescrita (la entrada de la página dice: "sí, la página que contiene la dirección x existe, está en RAM física en la dirección y") o rechazado, momento en el que se invoca al núcleo para manejar las cosas más adelante. El núcleo puede decidir matar el proceso infractor, o hacer algún trabajo y alterar las tablas MMU para que el acceso pueda ser intentado de nuevo, esta vez con éxito.

Esta es la base para la memoria virtual: desde el punto de vista, el proceso tiene algunos RAM, pero el núcleo lo ha movido al disco duro, en "espacio de intercambio". La tabla correspondiente está marcada como "ausente" en las tablas MMU. Cuando el proceso accede a sus datos, la MMU invoca el núcleo, que obtiene los datos del intercambio, los coloca de nuevo en algún espacio libre en la RAM física, y altera las tablas de la MMU para que apunten a ese espacio. El núcleo entonces salta de nuevo al código del proceso, justo en la instrucción que activó todo el proceso. El código de proceso no ve nada de todo el negocio, excepto que el acceso a la memoria tomó bastante tiempo.

La MMU también maneja los derechos de acceso, lo que impide que un proceso lea o escriba datos que pertenecen a otros procesos, o al núcleo. Cada proceso tiene su propio conjunto de tablas MMU, y el núcleo administra esas tablas. Por lo tanto, cada proceso tiene su propio espacio de direcciones, como si estuviera solo en una máquina con 4 GB de RAM except excepto que es mejor que el proceso no tenga acceso a la memoria que no asignó correctamente desde el núcleo, porque las páginas correspondientes están marcadas como ausentes o prohibidas.

Cuando se invoca el núcleo a través de una llamada al sistema desde algún proceso, el código del núcleo debe ejecutarse dentro del espacio de direcciones del proceso; por lo tanto, el código del núcleo debe estar en algún lugar del espacio de direcciones de cada proceso (pero protegido: las tablas MMU impiden el acceso a la memoria del núcleo desde código de usuario sin privilegios). Dado que el código puede contener direcciones codificadas, es mejor que el núcleo esté en la misma dirección para todos los procesos; convencionalmente, en Linux, esa dirección es 0xC0000000. Las tablas MMU de cada proceso asignan esa parte del espacio de direcciones a cualquier bloque físico RAM que el núcleo haya cargado en el arranque. Tenga en cuenta que la memoria del núcleo nunca se intercambia (si el código que puede leer los datos del espacio de intercambio se intercambiara, las cosas se agrieterían bastante rápido).

En un PC, las cosas pueden ser un poco más complicadas, porque hay modos de 32 bits y 64 bits, y registros de segmentos, y PAE (que actúa como una especie de MMU de segundo nivel con páginas enormes). El concepto básico sigue siendo el mismo: cada proceso obtiene su propia vista de un espacio de direcciones virtual de 4 GB, y el núcleo utiliza la MMU para asignar cada página virtual a una posición física apropiada en RAM, o en ninguna parte.

 17
Author: Thomas Pornin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-05 17:46:35

Osgx tiene una excelente respuesta, pero veo un comentario donde alguien todavía no entiende.

Cada artículo explica solo la situación, cuando ha instalado 4 GB de memoria y el kernel asigna el 1 GB en el espacio del kernel y el usuario los procesos utilizan la cantidad restante de RAM.

Aquí está mucha de la confusión. Hay memoria virtual y hay física de memoria. Cada CPU de 32 bits tiene 4 GB de memoria virtual . El kernel de Linux la división tradicional era 3G / 1G para la memoria de usuario y la memoria del kernel, pero las opciones más recientes permiten diferentes particiones.

¿Por qué distinguir entre el núcleo y el espacio de usuario? - mi propia pregunta

Cuando se intercambia una tarea, la MMU debe actualizarse. El espacio MMU del núcleo debe seguir siendo el mismo para todos los procesos. El núcleo debe manejar las interrupciones y las peticiones de fallos en cualquier momento.

¿Cómo funciona el mapeo virtual a físico? - mi propia pregunta.

Hay muchas permutaciones de memoria virtual.

  • una sola asignación privada a una página de RAM física.
  • una asignación virtual duplicada a una sola página física.
  • una asignación que arroja un SIGBUS u otro error.
  • una asignación respaldada por disk/swap.

De la lista anterior, es fácil ver por qué puede tener más espacio de direcciones virtual que memoria física. De hecho, el controlador de fallas normalmente inspeccionará la memoria del proceso información para ver si una página está mapeada (me refiero a asignada para el proceso), pero no en memoria. En este caso, el manejador de fallas llamará al subsistema de E/S para leer en la página. Cuando se ha leído la página y se han actualizado las tablas MMU para apuntar la dirección virtual a una nueva dirección física, se reanuda el proceso que causó el error.

Si entiende lo anterior, queda claro por qué le gustaría tener un mapeo virtual mayor que la memoria física. Se es cómo se admite el intercambio de memoria.

Hay otros usos. Por ejemplo, dos procesos pueden usar la misma biblioteca de código. Es posible que estén en diferentes direcciones virtuales en el espacio de proceso debido a la vinculación. Puede asignar las diferentes direcciones virtualesa la misma página física en este caso con el fin de ahorrar memoria física. Esto es bastante común para nuevas asignaciones; todas apuntan a una 'página cero' física. Cuando tocas / escribes la memoria, se copia la página cero y se asigna una nueva página física(COW o copy on write).

A veces también es útil tener las páginas virtuales aliñadas con una como cached y otra como non-cached. Las dos páginas se pueden examinar para ver qué datos se almacenan en caché y qué no.

Principalmente virtual y física no son lo mismo! Se indica fácilmente, pero a menudo confuso cuando se mira el código VMM de Linux.

 4
Author: artless noise,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-11 16:44:41

-

Hola, en realidad, no trabajo en la plataforma de hardware x86, por lo que puede haber algunos errores técnicos en mi publicación.

Que yo sepa, el rango entre 0(o 16)MB - 896MB aparece especialmente mientras tienes más RAM que ese número, digamos, tienes 1GB de RAM física en tu placa, lo que se llama "memoria baja". Si tienes más RAM física que 896MB en tu tablero, entonces, el resto de la RAM física se llama highmem.

Hablando de su pregunta, hay 512MiBytes RAM física en su tablero, así que en realidad, no hay 896, no hay highmem.

El núcleo RAM total puede ver y también puede mapear es de 512MB.

Porque hay una asignación de 1 a 1 entre la memoria física y la dirección virtual del núcleo, por lo que hay 512 mb de espacio de direcciones virtuales para el núcleo. Realmente no estoy seguro de si la frase anterior es correcta o no, pero es lo que pienso.

Lo que quiero decir es que si hay 512MBytes, entonces la cantidad de RAM física que el núcleo puede administrar también es 512MiBytes, además, el núcleo no puede crear un espacio de direcciones tan grande como más allá de 512MBytes.

Se refiere al espacio de usuario, hay un punto diferente, las páginas de la aplicación del usuario se pueden intercambiar al disco duro, pero las páginas del núcleo no pueden.

Por lo tanto, para el espacio de usuario, con la ayuda de tablas de páginas y otros módulos relacionados, parece que todavía hay espacio de direcciones 4GBytes. Por supuesto, esto es espacio de direcciones virtuales, no espacio físico RAM.

Esto es lo que yo entender.

Gracias.

 3
Author: shawn xy bai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-30 08:33:14

Si la memoria física es inferior a 896 MB, entonces el kernel de linux se asigna a esa dirección física de forma lineal.

Para más detalles vea esto.. http://learnlinuxconcepts.blogspot.in/2014/02/linux-addressing.html

 0
Author: JIN007,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-09 12:54:09