¿Por qué los sistemas x86-64 solo tienen un espacio de direcciones virtuales de 48 bits?

En un libro, leo lo siguiente:

Los procesadores de 32 bits tienen 2 ^ 32 direcciones posibles, mientras que los procesadores actuales de 64 bits tienen un espacio de direcciones de 48 bits

Mi expectativa era que si se trata de un procesador de 64 bits, el espacio de direcciones también debería ser de 2 ^ 64.

Entonces me preguntaba ¿cuál es el motivo de esta limitación?

Porque eso es todo lo que se necesita. 48 bits le dan un espacio de direcciones de 256 terabytes. Eso es mucho. No verá un sistema que necesite más que eso pronto.

Entonces, los fabricantes de CPU tomaron un atajo. Usan un conjunto de instrucciones que permite un espacio completo de direcciones de 64 bits, pero las CPU actuales solo usan los 48 bits más bajos. La alternativa era gastar transistores en el manejo de un espacio de direcciones más grande que no iba a ser necesario durante muchos años.

Entonces, una vez que nos acercamos al límite de 48 bits, solo se trata de liberar CPU que manejan todo el espacio de direcciones, pero no requerirá ningún cambio en el conjunto de instrucciones, y no romperá la compatibilidad.

Cualquier respuesta que se refiera al tamaño del bus y la memoria física es ligeramente errónea, ya que la pregunta de OP se refería al espacio de direcciones virtuales, no al espacio de direcciones físicas . Por ejemplo, el límite supuestamente análogo en algunos 386 era un límite en la memoria física que podían usar, no el espacio de direcciones virtuales, que siempre era un total de 32 bits. En principio, podría usar 64 bits completos de espacio de direcciones virtuales incluso con solo unos pocos MB de memoria física; por supuesto, puede hacerlo mediante el intercambio o para tareas especializadas en las que desee asignar la misma página en la mayoría de las direcciones (por ejemplo, ciertas operaciones de datos dispersos).

Creo que la verdadera respuesta es que AMD estaba siendo barato y esperaba que a nadie le importara por ahora, pero no tengo referencias para citar.

Lea la sección de limitaciones del artículo de wikipedia :

Una PC no puede contener 4 petabytes de memoria (debido al tamaño de los chips de memoria actuales, nada más) pero AMD previó servidores grandes, clústeres de memoria compartida y otros usos del espacio de direcciones físicas que podrían acercarse a esto en un futuro previsible. la dirección física de bit proporciona un amplio espacio para la expansión sin incurrir en el costo de implementar direcciones físicas de 64 bits

Es decir, no tiene sentido implementar el direccionamiento completo de 64 bits en este punto, porque no podemos construir un sistema que pueda utilizar dicho espacio de direcciones en su totalidad, por lo que elegimos algo que sea práctico para los sistemas de hoy (y de mañana).

El ancho interno del registro / operación nativo no necesita reflejarse en el ancho del bus de la dirección externa.

Supongamos que tiene un procesador de 64 bits que solo necesita acceder a 1 megabyte de RAM. Un bus de direcciones de 20 bits es todo lo que se requiere. ¿Por qué molestarse con el costo y la complejidad del hardware de todos los pines adicionales que no usará?

El Motorola 68000 era así; 32 bits internamente, pero con un bus de direcciones de 23 bits (y un bus de datos de 16 bits). La CPU podía acceder a 16 megabytes de RAM, y para cargar el tipo de datos nativo (32 bits) se necesitaban dos accesos de memoria (cada uno con 16 bits de datos).

Desde mi punto de vista, esto es resultado del tamaño de página. Cada página como máximo contiene 4096/8 = 512 entradas de tabla de página. Y 2 ^ 9 = 512. Entonces 9 * 4 + 12 = 48.

Hay una razón más grave que simplemente guardar transistores en la ruta de direcciones de la CPU: si aumenta el tamaño del espacio de direcciones, necesita boost el tamaño de página, boost el tamaño de las tablas de páginas o tener una estructura de tabla de páginas más profunda (eso hay más niveles de tablas de traducción). Todas estas cosas aumentan el costo de una falla TLB, lo que perjudica el rendimiento.

No es cierto que solo se usan los 48 bits de bajo rango de un VA de 64 bits, al menos con Intel 64. Los 16 bits superiores se usan, más o menos, tipo de.

Sección 3.3.7.1 Direccionamiento canónico en las architectures Intel® 64 e IA-32 El Manual del desarrollador de software dice:

una dirección canónica debe tener los bits 63 a 48 configurados en ceros o unos (dependiendo de si el bit 47 es cero o uno)

Por lo tanto, los bits del 47 al 63 forman un superbit, ya sea todos 1 o todos 0. Si una dirección no está en forma canónica, la implementación debería tener errores.

En AArch64, esto es diferente. Según el Resumen del conjunto de instrucciones ARMv8 , es un VA de 49 bits.

El sistema de traducción de memoria AArch64 admite una dirección virtual de 49 bits (48 bits por tabla de traducción). Las direcciones virtuales se extienden por signo desde 49 bits y se almacenan dentro de un puntero de 64 bits. Opcionalmente, bajo el control de un registro del sistema, los 8 bits más significativos de un puntero de 64 bits pueden contener una “etiqueta” que se ignorará cuando se use como una dirección de carga / almacén o como el objective de una twig indirecta

Una CPU se considera “N bits” principalmente en su tamaño de bus de datos, y en gran parte de sus entidades (architecture interna) : registros, acumuladores, unidad lógica-aritmética (ALU), conjunto de instrucciones, etc. Por ejemplo: La buena y vieja CPU Motorola 6800 (o Intel 8050) es una CPU de 8 bits. Tiene un bus de datos de 8 bits, architecture interna de 8 bits y un bus de direcciones de 16 bits.


  • Aunque la CPU N-bits puede tener algunas entidades que no sean N-size. Por ejemplo, las impovments en el 6809 sobre el 6800 (ambas son CPU de 8 bits con un bus de datos de 8 bits). Entre las mejoras significativas introducidas en el 6809 se encuentran el uso de dos acumuladores de 8 bits (A y B, que se podrían combinar en un solo registro de 16 bits, D), dos registros de índice de 16 bits (X, Y) y dos Punteros de stack de 16 bits.

Mucha gente tiene esta idea equivocada. Pero le prometo que si lee esto cuidadosamente, después de leer esto, todos sus conceptos erróneos serán claros.

Decir que un procesador de 32 bits o 64 bits no significa que debería tener un bus de direcciones de 32 bits o un bus de direcciones de 64 bits, respectivamente! … ¡Lo repito, NO LO HACE!

Procesador de 32 bits significa que tiene ALU de 32 bits (unidad aritmética y lógica) … eso significa que puede operar en un operando binario de 32 bits (o simplemente decir un número binario que tiene 32 dígitos) y de manera similar el procesador de 64 bits puede operar en binario de 64 bits operando. Así que el clima de un procesador de 32 bits o 64 bits NO significa que se pueda instalar la cantidad máxima de memoria. Simplemente muestran qué tan grande puede ser el operando … (por analogía, puede pensar que una calculadora de 10 dígitos puede calcular resultados de hasta 10 dígitos … no puede darnos 11 dígitos o cualquier otro resultado más grande … aunque es en decimales, pero estoy diciendo esta analogía por simplicidad) … pero lo que usted dice es espacio de direcciones que es el tamaño máximo de memoria directamente divisible (RAM). El tamaño máximo posible de RAM se determina por el tamaño del bus de direcciones y no es el tamaño del bus de datos o incluso ALU en el que se define el tamaño del procesador (32/64 bits). Sí, si un procesador tiene “Bus de direcciones” de 32 bits, entonces es capaz de direccionar 2 ^ 32 byte = 4GB de RAM (o para 64 bit será 2 ^ 64) … pero decir que un procesador de 32 bit o 64 bit tiene nada relevante para este espacio de direcciones (espacio de direcciones = qué tan lejos puede acceder a la memoria o el tamaño máximo de RAM) y solo depende del tamaño de su ALU. Por supuesto, el bus de datos y el bus de direcciones pueden ser del mismo tamaño y puede parecer que un procesador de 32 bits significa que accederá a 2 ^ 32 bytes o 4 GB de memoria … pero es solo una coincidencia y no será lo mismo para todos … por ejemplo, Intel 8086 es un procesador de 16 bits (ya que tiene ALU de 16 bits), por lo que se dice que debería haber accedido a 2 ^ 16 bytes = 64 KB de memoria, pero no es cierto. Puede acceder a hasta 1 MB de memoria por tener un bus de direcciones de 20 bits …. Puede google si tiene dudas 🙂

Creo que ya expliqué mi punto de vista. En cuanto a su pregunta … como un procesador de 64 bits no significa que deba tener un bus de direcciones de 64 bits, por lo que no está mal tener un bus de direcciones de 48 bits en un procesador de 64 bits … mantuvieron el espacio de direcciones más pequeño para que el diseño y la fabricación fueran baratos … ya que nadie va a usar una memoria tan grande (2 ^ 64 byte) … donde 2 ^ 48 bytes es más que suficiente hoy en día.