¿Por qué en 64 bits la dirección virtual tiene 4 bits de longitud (48 bits de longitud) en comparación con la dirección física (52 bits de longitud)?

En el libro “Progtwigción de bajo nivel: C, ensamblaje y ejecución de progtwigs en la architecture Intel® 64”, leí:

Cada dirección virtual de 64 bits (por ejemplo, las que estamos utilizando en nuestros progtwigs) consta de varios campos. La dirección en sí misma es de hecho solo 48 bits de ancho; está extendido por signo a una dirección canónica de 64 bits. Su característica es que sus 17 bits a la izquierda son iguales. Si la condición no se cumple, la dirección se rechaza inmediatamente cuando se usa. Luego, 48 bits de dirección virtual se transforman en 52 bits de dirección física con la ayuda de tablas especiales.

¿Por qué es la diferencia en 4 bits entre la dirección virtual y la dirección física?

Creo que estás hablando de x86-64, mi respuesta se basa en esa architecture.


Cuando se opera en modo de 64 bits, la CPU utiliza una función renovada para traducir direcciones virtuales a direcciones físicas conocidas como PAE: extensión de dirección física .
Inicialmente inventado para romper el límite 4GiB mientras sigue utilizando punteros de 32 bits, esta característica implica el uso de 4 niveles de tablas.
Cada tabla da un puntero a la siguiente tabla, abajo a la derecha que da los bits superiores de la dirección física. Para obtener una idea, mire esta imagen del Manual de progtwigción de architecture AMD64 :

Paginación de 4 niveles, PAE, en modo largo

El razonamiento detrás de todas esas tablas es la dispersión : los metadatos para traducir direcciones virtuales en direcciones físicas son enormes; si tuviéramos que usar páginas de 4KiB solo necesitaríamos 2 64 – 12 = 2 52 entradas para cubrir todo el espacio de direcciones de 64 bits .
Las tablas permiten un enfoque escaso, solo las entradas necesarias se llenan en la memoria.

Este diseño se refleja en cómo se divide la dirección virtual (y, por lo tanto, indirectamente, en el número de niveles), solo se utilizan ejecuciones de 9 bits para indexar las tablas en cada nivel.
A partir del bit 12 incluido, esto proporciona: nivel 1 -> 12-20, nivel 2 -> 21-29, nivel 3 -> 30-38, nivel 4 -> 39-47.

Esto explica el límite de implementación actual de solo 48 bits de espacio de direcciones virtuales.
Tenga en cuenta que en el nivel de instrucción, donde se usan direcciones lógicas, tenemos soporte completo para direcciones de 64 bits.
El soporte completo también está disponible en el nivel de segmentación, la parte que traduce las direcciones lógicas en direcciones lineales.
Entonces la limitación proviene de PAE.

Mi opinión personal es que AMD se apresuró a ser el primero en enviar una CPU x86 con soporte de 64 bits y reutilizar PAE, parchándolo con un nuevo nivel de indirección para traducir hasta 48 bits.
Tenga en cuenta que tanto Intel como AMD permiten que una implementación futura use 64 bits para la dirección virtual (probablemente con más tablas).

Sin embargo, ambas compañías establecen un límite estricto de 52 bits para la dirección física. ¿Por qué?

La respuesta aún se puede encontrar en cómo funciona la búsqueda.
En el modo de 32 bits, cada entrada en cada tabla tiene 32 bits de ancho; los bits bajos se usan como indicadores (ya que los requisitos de alineación los vuelven inútiles para el proceso de traducción), pero los bits más altos se usaron todos para la traducción, dando una traducción virtual / física de 32/32.
Es importante destacar que se usaron los 32 bits, mientras que algunos de los bits inferiores no se usaron como indicadores, Intel los marcó como “Ignorado” o “Disponible”, lo que significa que el sistema operativo era libre de usarlos.

Cuando Intel introdujo PAE, necesitaban 4 bits más (PAE tenía 36 bits en ese momento) y lo lógico era duplicar el tamaño de cada entrada, ya que esto crea un diseño más eficiente que, por ejemplo, una entrada de tabla de 40 bits.
Esto le dio a Intel mucho espacio libre y lo marcó como reservado (Esto se puede observar mejor en las versiones anteriores de los manuales de Intel SDM, como esta ).

Con el tiempo, se necesitaban nuevos atributos en una entrada, siendo el más famoso el bit XD / NX .
Las claves de protección también son una función relativamente nueva que ocupa espacio en una entrada. Esto muestra que ya no es posible realizar una traducción física / virtual completa de 64/64 bits con el ISA actual.

Para una referencia visual, aquí está el formato de las entradas de la tabla PAE de 64 bits:

Entradas de tabla PAE Intel de 64 bits

Muestra que no es posible una dirección física de 64 bits (para las páginas grandes todavía hay una manera de solucionar esto, pero dado el diseño de los bits que parece improbable), pero no explica por qué AMD estableció el límite en 52 bits.

Bueno, es difícil de decir.
Ciertamente, el tamaño del espacio de direcciones físicas tiene algún costo de hardware asociado: más pines (aunque con el controlador de memoria integrado, esto se mitiga ya que las especificaciones DDR multiplexan muchas señales) y más espacio en las memorias caché / TLB.
En esta pregunta (similar pero no lo suficiente, haga de esto un duplicado) una respuesta es Wikipedia, que a su vez cita a AMD alegando que los ingenieros de AMD establecen el límite en 52 bits después de las debidas consideraciones de beneficios y costos.

Comparto lo que escribió Hans Passant hace más de 6 años : los mecanismos de búsqueda actuales no son adecuados para un direccionamiento físico completo de 64 bits y esa es probablemente la razón por la que tanto Intel como AMD nunca se molestaron en mantener los bits altos en cada entrada reservada.

Ambas compañías saben que como la tecnología se acercará al límite de 52 bits, también será muy diferente de su forma real.
Para el momento en que habrán diseñado un mejor mecanismo para la memoria en general, entonces evitarán sobre-diseñar el existente.