2009-11-01 15 views
9

Me falta algo cuando se trata de comprender la necesidad de highmem para abordar más de 1GB de RAM. ¿Podría alguien señalar dónde me equivoco? ¡Gracias!Linux 3/1 dirección virtual dividida

lo que sé:

  • 1 GB de memoria virtual a los procesos (región de memoria alta) se reserva para las operaciones del kernel. El espacio de usuario puede usar los 3 GB restantes. Esta es la división 3/1.

  • Las características de memoria virtual de la VM asignan las páginas de memoria virtual (continua) a las páginas físicas (RAM).

Lo que no sé:

  • ¿Qué operaciones utilizan la memoria virtual del núcleo? Supongo que cosas como kmalloc (...) en kernel-space usarían la memoria virtual kernel.

  • Creo que se podrían utilizar 4 GB de RAM en este esquema. No entiendo por qué el kernel de 1 GB de espacio virtual es el factor limitante al abordar el espacio físico. Aquí es donde mi comprensión se descompone. Por favor avise.

He estado leyendo esto (http://kerneltrap.org/node/2450), que es grande. Pero no completa mi pregunta a mi gusto.

+0

"Con 32 bits, es posible direccionar 4 GB de memoria. Hasta hace poco, Linux en sistemas de 32 bits se limitaba a mucha menos memoria que eso, debido a la forma en que configura la dirección virtual espacio." -desde LDD, capítulo 13 Supongo que mi pregunta es, ¿por qué se limita a sustancialmente menos memoria. – David

Respuesta

9

La razón por la cual el espacio virtual del kernel es un factor limitante en la memoria física utilizable es porque el kernel necesita acceso a toda la memoria física y la forma en que accede a la memoria física a través de las direcciones virtuales del kernel. El kernel no utiliza instrucciones especiales que permiten el acceso directo a las ubicaciones de la memoria física; tiene que configurar las entradas de la tabla de páginas para cualquier rango físico con el que quiera hablar.

En el esquema de "viejo estilo", las cosas conjunto del núcleo de modo que las tablas de páginas de cada proceso asignan direcciones virtuales desde 0xC0000000 a 0xFFFFFFFF directamente a las direcciones físicas de 0x00000000 a 0x3FFFFFFF (estas páginas fueron marcados por lo que sólo eran accesibles en anillo 0 - modo kernel). Estas son las "direcciones virtuales del kernel". Bajo este esquema, el kernel podría leer y escribir directamente cualquier ubicación de la memoria física sin tener que jugar con la MMU para cambiar las asignaciones.

Bajo el esquema HIGHMEM, las asignaciones de las direcciones virtuales del núcleo a las direcciones físicas no son fijas: partes de la memoria física se asignan dentro y fuera del espacio de direcciones virtuales del kernel ya que el kernel necesita acceso a esa memoria. Esto permite que se use más memoria física, pero a costa de tener que cambiar constantemente las asignaciones virtuales a físicas, lo cual es una operación bastante costosa.

+0

Por lo tanto, bajo el "viejo esquema", cualquier proceso en modo kernel podría abordar toda la memoria física (incluida la memoria no asociada a ese proceso en particular)? – David

+3

Sí, absolutamente (y todavía pueden, simplemente tienen que pasar por los aros para hacerlo a veces). Esto es necesario, por ejemplo, las interrupciones se atienden en el contexto de cualquier proceso que se estaba ejecutando en el momento en que ocurrió la interrupción. El núcleo es un poco como una gran biblioteca compartida, excepto que su código se ejecuta en un nivel de privilegio elevado (y no puede simplemente invocarlo; necesita pasar por un punto de entrada especial que eleve el nivel de privilegio). – caf

+0

Entonces, bajo el "viejo esquema" cuando hago un kmalloc (...), asigna memoria virtual del kernel, que realmente se traduce en memoria física, ¿que nunca se intercambiará en el disco? – David

-2
  1. Por ejemplo, las llamadas al sistema utilizan el espacio del kernel.
  2. Puede tener 64 GB de RAM física, pero en las plataformas de 32 bits, los procesadores solo pueden acceder a 4 GB debido al direccionamiento virtual de 32 bits. En realidad, puede tener 1 GB de RAM y 3 GB de intercambio y direcciones virtuales que harán parecer que tiene 4 GB. En las plataformas de 64 bits, el direccionamiento virtual es prácticamente ilimitado.
+0

Anacrolix: ¿qué? – Alexandru

+0

1GB de RAM y 3GB de intercambio? Eso no tiene ningún sentido ... en una máquina de 32 bits no es necesario tener ningún intercambio para trabajar hasta el límite de direccionamiento de su arquitectura. –

+0

Yo fui un ejemplo. – Alexandru

4

La asignación de 1 GB al kernel en cada proceso permite que los procesos cambien al modo kernel sin realizar también un cambio de contexto. Las respuestas a las llamadas al sistema tales como read(), mmap() y otras pueden procesarse adecuadamente en el espacio de direcciones del proceso de llamada. Si el espacio para el kernel no estaba reservado en cada proceso, cambiar al "modo kernel" entre ejecutar código de espacio de usuario sería más costoso y no podría usar la asignación de direcciones virtuales a través del hardware MMU (unidad de administración de memoria) para las llamadas del sistema a las que se está atendiendo.

Los sistemas que ejecutan un kernel de 32 bits con más de 1 GB de memoria física, son capaces de asignar las posiciones de memoria física en ZONE_HIGHMEM (más o menos por encima de la marca de 1 GB), que puede requerir el kernel para saltar a través de aros para ciertas operaciones de interactuar con ellos . La adición de PAE (extensión de dirección física) amplía este problema al permitir hasta 64 GB de memoria física, disminuyendo la proporción de memoria dentro de la memoria de dirección física de 1 GB, a regiones asignadas en ZONE_HIGHMEM.

+0

Sí, las razones para tener memoria virtual kernel son claras. Pero en los días previos a HIGHMEM, ¿por qué el espacio de memoria virtual del kernel es el factor limitante en el direccionamiento de la memoria física? – David

Cuestiones relacionadas