linux-kernel - gestion - liberar memoria swap solaris
¿Cómo gestiona el kernel de Linux la memoria física de menos de 1GB? (5)
-
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 se enumera especialmente, mientras que usted tiene más memoria RAM que ese número, por ejemplo, tiene 1 GB de RAM física en su tarjeta, que se llama "memoria baja". Si tiene más RAM física que 896 MB en su placa, entonces, el resto de la RAM física se llama highmem.
Hablando de tu pregunta, hay 512MiBytes de RAM física en tu placa, así que, en realidad, no hay 896, no highmem.
El kernel RAM total puede ver y también puede mapear es 512MB.
Porque hay una correspondencia de 1 a 1 entre la memoria física y la dirección virtual del kernel, por lo que hay un espacio de direcciones virtuales de 512MiBytes para kernel. Realmente no estoy seguro de si la oración anterior es correcta o no, pero es lo que tengo en mente.
Lo que quiero decir es que si hay 512MBytes, entonces la cantidad de RAM física que el kernel puede gestionar también es de 512MiBytes, además, el kernel no puede crear un espacio de direcciones tan grande como más allá de 512MBytes.
Consulte el 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 kernel no.
Por lo tanto, para el espacio del usuario, con la ayuda de tablas de páginas y otros módulos relacionados, parece que todavía hay 4 GBytes de espacio de direcciones. Por supuesto, este es el espacio de direcciones virtuales, no el espacio de RAM físico.
Esto es lo que entiendo.
Gracias.
Estoy aprendiendo las partes internas del kernel de Linux y mientras leía "Entender Linux Kernel", me llamaron la atención algunas preguntas relacionadas con la memoria. Una de ellas es cómo el kernel de Linux maneja la asignación de memoria si la memoria física de, digamos, solo 512 MB está instalada en mi sistema.
A medida que leo, Kernel mapea 0 (o 16) MB-896MB de RAM física en una dirección lineal de 0xC0000000 y puede abordarla directamente. Entonces, en el caso descrito arriba donde solo tengo 512 MB:
¿Cómo puede el kernel mapear 896 MB desde solo 512 MB? En el esquema descrito, el kernel configuró las cosas para que cada tabla de páginas del proceso asignara 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 los procesos de modo de usuario en esta situación?
Cada artículo explica solo la situación, cuando ha instalado 4 GB de memoria y el kernel mapea los 1 GB en el espacio del kernel y los procesos de usuario usan la cantidad restante de RAM.
Agradecería cualquier ayuda para mejorar mi comprensión.
Gracias..!
El hardware proporciona una Unidad de gestión de memoria . Es una pieza de circuito que puede interceptar y alterar el 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 de datos desencadenado por una instrucción, lo hace en alguna dirección que, en términos generales, es 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: esa es la cantidad de bytes que podría tener una dirección única.
Entonces, el procesador envía la solicitud a su subsistema de memoria, como "captura el byte en la dirección x y me lo devuelve". 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 use, pero los tamaños típicos son de 4 y 8 kB. La MMU usa tablas que le dicen qué hacer con los accesos de cada página: el acceso se concede 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, en cuyo punto se invoca al kernel para manejar las cosas más. El kernel puede decidir eliminar el proceso ofensivo, o hacer algún trabajo y modificar las tablas MMU para que el acceso pueda ser intentado de nuevo, esta vez con éxito.
Esta es la base de la memoria virtual : desde el punto de vista, el proceso tiene algo de RAM, pero el kernel lo ha movido al disco duro, en "espacio de intercambio". La tabla correspondiente está marcada como "ausente" en las tablas de MMU. Cuando el proceso accede a sus datos, la MMU invoca el núcleo, que recupera los datos del intercambio, lo pone de nuevo en algún espacio libre en la memoria RAM física y altera las tablas MMU para apuntar a ese espacio. Luego, el kernel vuelve al código de proceso, justo en la instrucción que desencadenó todo. El código de proceso no ve nada de todo el asunto, 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 kernel. Cada proceso tiene su propio conjunto de tablas MMU, y el kernel 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, excepto que era mejor no acceder al proceso que no asignaba correctamente desde el núcleo, porque las páginas correspondientes están marcadas como ausente o prohibido.
Cuando se invoca el núcleo a través de una llamada al sistema desde algún proceso, el código del kernel debe ejecutarse dentro del espacio de direcciones del proceso; por lo tanto, el código del kernel 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 kernel desde el código de usuario sin privilegios). Como el código puede contener direcciones codificadas, es mejor que el kernel esté en la misma dirección para todos los procesos; convencionalmente, en Linux, esa dirección es 0xC0000000. Las tablas de MMU para cada proceso asignan esa parte del espacio de direcciones a cualquier RAM física que bloquee el kernel que realmente se cargó durante el arranque. Tenga en cuenta que la memoria del kernel nunca se intercambia (si el código que puede leer datos del espacio de intercambio se cambia, las cosas se agriarían bastante rápido).
En una PC, las cosas pueden ser un poco más complicadas, porque hay modos de 32 bits y de 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 de 4 GB virtuales, y el kernel usa la MMU para asignar cada página virtual a una posición física apropiada en la RAM, o en ningún lugar.
No todas las direcciones virtuales (lineales) deben asignarse a nada. Si el código accede a la página no asignada, 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 memoria virtual de proceso y 0xc0000000 .. 0xffffffff es una memoria virtual de kernel.
- ¿Cómo puede el kernel mapear 896 MB desde solo 512 MB?
Mapas de hasta 896 MB. Entonces, si tiene solo 512, solo habrá 512 MB mapeados.
Si su memoria física está en 0x00000000 a 0x20000000, se asignará para acceso directo al kernel a direcciones virtuales 0xC0000000 a 0xE0000000 (mapeo lineal).
- ¿Qué pasa con los procesos de modo de usuario en esta situación?
La memoria física para los procesos del usuario se asignará (no de forma secuencial, sino en lugar de asignación aleatoria de página a página) a las direcciones virtuales 0x0 .... 0xc0000000. Este mapeo será el segundo mapeo para páginas desde 0..896MB. Las páginas se tomarán de listas de páginas gratuitas.
- ¿Dónde están los procesos de modo de usuario en la memoria RAM física?
En cualquier sitio.
- Cada artículo explica solo la situación, cuando instaló 4 GB de memoria y el
No. Cada artículo explica cómo se mapean 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
8.1.3. Memory Zones
de 8.1.3. Memory Zones
del libro Linux Kernel Development
de Robert Love (utilizo 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 de 16 MB como máximo y 896 MB como mínimo.
- ZONE_HIGHMEM: contiene marcos de página de memoria de 896 MB y superiores.
Por lo tanto, si tiene 512 MB, su ZONE_HIGHMEM estará vacío y ZONE_NORMAL tendrá asignados 496 MB de memoria física.
Además, eche un vistazo a 2.5.5.2. Final kernel Page Table when RAM size is less than 896 MB
2.5.5.2. Final kernel Page Table when RAM size is less than 896 MB
sección de 2.5.5.2. Final kernel Page Table when RAM size is less than 896 MB
del libro. Se trata de un caso, cuando tienes menos memoria que 896 MB.
Además, para ARM hay una 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 asignada directamente de la memoria
Si la memoria física es inferior a 896 MB, el núcleo de Linux se correlaciona linealmente con esa dirección física.
Para más detalles, consulte esto .. http://learnlinuxconcepts.blogspot.in/2014/02/linux-addressing.html
osgx tiene una respuesta excelente, 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 mapea los 1 GB en el espacio del kernel y los procesos de usuario usan la cantidad restante de RAM.
Aquí hay mucha confusión. Hay memoria virtual y memoria física . Cada CPU de 32 bits tiene 4 GB de memoria virtual . La división tradicional del kernel de Linux era 3G / 1G para la memoria del usuario y la memoria del kernel, pero las opciones más nuevas permiten una partición diferente.
¿Por qué distinguir entre el kernel y el espacio de usuario? - mi propia pregunta
Cuando una tarea se intercambia, la MMU debe actualizarse. El espacio MMU del kernel debe permanecer igual para todos los procesos. El núcleo debe manejar interrupciones y solicitudes de fallas 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.
- un mapeo virtual duplicado en una sola página física.
- un mapeo que arroja un SIGBUS u otro error.
- un mapeo respaldado por disco / intercambio.
De la lista anterior, es fácil ver por qué puede tener más espacio de direcciones virtuales que la memoria física. De hecho, el manejador de fallas generalmente inspeccionará la información de la memoria del proceso para ver si una página está mapeada (es decir, asignada para el proceso), pero no en la memoria . En este caso, el controlador 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 de MMU para señalar la dirección virtual a una nueva dirección física, se reanuda el proceso que causó la falla.
Si comprende lo anterior, queda claro por qué le gustaría tener un mapeo virtual más grande que la memoria física. Así es como se admite el intercambio de memoria.
Hay otros usos. Por ejemplo, dos procesos pueden usar la misma biblioteca de códigos. Es posible que estén en diferentes direcciones virtuales en el espacio de proceso debido a la vinculación. En este caso, puede asignar las diferentes direcciones virtuales a la misma página física para guardar la memoria física. Esto es bastante común para nuevas asignaciones; todos apuntan a una ''página cero'' física. Cuando toca / escribe la memoria, se copia la página cero y se asigna una nueva página física (VACA o copia al escribir).
También es útil a veces tener las páginas virtuales con alias, una en caché y otra no en caché . Las dos páginas se pueden examinar para ver qué datos se almacenan en caché y cuáles no.
¡Principalmente virtual y físico no son lo mismo! Fácilmente establecido, pero a menudo confuso cuando se mira el código de Linux VMM.