2012-06-28 12 views
5

El espacio de direcciones virtuales del usuario para x86-64 con Linux tiene 47 bits de longitud. Lo que esencialmente significa que Linux puede mapear un proceso con un rango de direcciones virtuales de ~ 128 TB.¿Cómo soporta Linux más de 512 GB de rango de direcciones virtuales en x86-64?

Sin embargo, lo que me confunde es que la arquitectura x86-64 admite la tabla de páginas jerárquicas de 4 niveles definidas por ISA (dispuestas como radix-tree) para cada proceso. La raíz de la tabla de páginas solo puede asignar hasta 512 GB de espacio de direcciones virtuales contiguas. Entonces, ¿cómo Linux puede soportar más de 512 GB de rango de direcciones virtuales? ¿Utiliza varias tablas de página para cada proceso? En caso afirmativo, entonces para un proceso, ¿qué debe contener el CR3 (x86-64 para contener la dirección de la base de la tabla de páginas) para un proceso dado? ¿Me estoy perdiendo de algo?

Respuesta

7

La raíz de la tabla de páginas solo puede asignar hasta 512 GB de espacio de direcciones virtuales contiguas. Entonces, ¿cómo Linux puede soportar más de 512 GB de rango de direcciones virtuales? ¿Utiliza varias tablas de página para cada proceso? En caso afirmativo, entonces para un proceso, ¿qué debe contener el CR3 (x86-64 para contener la dirección de la base de la tabla de páginas) para un proceso dado? ¿Me estoy perdiendo de algo?

No sé lo que quiere usted decir con "raíz de la tabla de páginas", pero paginación en x86-64 se ve así:

  • tablas de páginas - el nivel más bajo de las estructuras de paginación. Cada uno tiene 512 entradas de 8 bytes (PTE) que describen una página de 4 Kbits, por lo que PT describe 512 * 4 KiB = 2 MiB de memoria (también puede funcionar como 2 páginas MiB, pero dejémoslas por ahora).
  • Directorios de página: tabla, similar a PT, que contiene 512 entradas de 8 bytes (PDE) que apuntan a los PT; entonces, PD describe 512 * 2 MiB = 1 GiB de memoria (también puede funcionar como 1 página de GiB, similar a PT).
  • Tabla de páginas del directorio de páginas - similar a PD, pero contiene 512 entradas de 8 bytes (PDPTE) apuntando a PD; entonces, PDPTE describe 512 * 1 Gib = 512 GiB de memoria.
  • PML4, el nivel más alto de estructuras de paginación, es una tabla que contiene 512 entradas de 8 bytes (PML4E) apuntando a PDPT; entonces, PML4 describe 512 * 512 GiB = 256 TiB de memoria.

No sé mapa de memoria exacta de Linux, pero probablemente el medio más alto (de -128 a 0 TiB - desde 0xFFFF800000000000 a 0xFFFFFFFFFFFFFFFF) está reservado para el núcleo, la mitad inferior (de 0 a 128 TiB - desde 0x0000000000000000 a 0x00007FFFFFFFFFFF) es para aplicaciones de espacio de usuario. Por lo tanto, Linux admite 512 veces los 512 GiB del rango de direcciones virtuales que está solicitando; incluso Torvalds no dijo "no admitiremos PML4". No sé qué te confunde: ¿es el hecho de que te perdiste la parte diciendo que la tabla de páginas asigna 2 MiB y la has tomado como corresponde a una página? 4 KiB, pero si hay algo que pueda aclarar, pregunta sobre eso.

+0

Gracias por la aclaración.Me equivoqué un nivel y, por lo tanto, la confusión. Está claro ahora. – Arka

0

Normalmente, los espacios de direcciones de proceso no se comparten, lo que significa que tampoco las tablas de páginas involucradas se comparten entre distintos procesos. Y eso significa en los 4 niveles de la mesa.

Por supuesto, la parte común (kernel) siempre está presente en todos los espacios de direcciones, por lo que, de hecho, se comparte, pero la memoria solo es accesible para el kernel.

Aparte de eso, de hecho, cada proceso tiene sus propias tablas de página prácticamente y no hay ningún problema con el uso de todas las direcciones 2 en cualquiera de ellas. Al menos, no existe una limitación especial por parte de la CPU, aunque puede existir por parte del sistema operativo.

Cuestiones relacionadas