x86-64 - x64 - x86 que significa
¿Por qué los sistemas x86-64 tienen solo un espacio de direcciones virtuales de 48 bits? (10)
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 2 ^ 64.
Así que me preguntaba cuál es la razón de esta limitación?
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 fue sobre el espacio de direcciones virtuales y no sobre el 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 en el espacio de direcciones virtuales, que siempre era un total de 32 bits. En principio, podría usar un espacio de direcciones virtuales de 64 bits completos incluso con unos pocos MB de memoria física; por supuesto, puede hacerlo intercambiando, 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 respuesta real es que AMD solo estaba siendo barato y esperaba que a nadie le importara ahora, pero no tengo referencias a citar.
Desde mi punto de vista, esto se debe al tamaño de la página. Cada página como máximo contiene 4096/8 = 512 entradas de la tabla de páginas. Y 2 ^ 9 = 512. Entonces 9 * 4 + 12 = 48.
El ancho de operación / registro nativo interno no necesita reflejarse en el ancho del bus de direcciones externo.
Digamos que tienes 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 pudo acceder a 16 megabytes de RAM, y para cargar el tipo de datos nativos (32 bits) tomó dos accesos de memoria (cada uno con 16 bits de datos).
Hay una razón más grave que el simple hecho de guardar transistores en la ruta de la dirección de la CPU: si aumenta el tamaño del espacio de direcciones, necesita aumentar el tamaño de la página, aumentar el tamaño de las tablas de la página o tener una estructura de tabla de la página más profunda (que Hay más niveles de tablas de traducción). Todas estas cosas aumentan el costo de una falla de TLB, lo que afecta el rendimiento.
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 y nada más), pero AMD imaginó grandes servidores, clusters de memoria compartida y otros usos del espacio de direcciones físicas que podrían aproximarse a esto en un futuro previsible, y la dirección física de bits 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 un direccionamiento completo de 64 bits en este punto, porque no podemos construir un sistema que pueda utilizar ese espacio de direcciones en su totalidad, por lo que elegimos algo que sea práctico para los sistemas de hoy (y de mañana).
Muchas personas tienen esta idea falsa. Pero le prometo que si lee esto atentamente, después de leer esto, se aclararán todos sus conceptos erróneos.
¡Decir que un procesador de 32 bits o 64 bits no significa que deba tener un bus de direcciones de 32 bits o un bus de direcciones de 64 bits respectivamente! ... ¡Lo repito NO LO HACE!
El 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 de 32 dígitos) y, de manera similar, el procesador de 64 bits puede operar en binarios de 64 bits operando Por lo tanto, el clima de un procesador de 32 o 64 bits NO significa que se pueda instalar la cantidad máxima de memoria. Solo muestran qué tan grande puede ser el operando ... (por analogía, puede pensar en una calculadora de 10 dígitos que puede calcular resultados de hasta 10 dígitos ... no puede darnos 11 dígitos ni ningún otro resultado mayor ... aunque es en decimal, pero estoy diciendo esta analogía por simplicidad) ... pero lo que está diciendo es un espacio de direcciones que es el tamaño máximo de la memoria (RAM) directamente interconectable. El tamaño máximo posible de la RAM está determinado por el tamaño del bus de direcciones y no es el tamaño del bus de datos o incluso la ALU en la que se define el tamaño del procesador (32/64 bit). Sí, si un procesador tiene un "Bus de dirección" de 32 bits, entonces puede direccionar 2 ^ 32 bytes = 4 GB de RAM (o para 64 bits será 2 ^ 64) ... pero un procesador de 32 bits o 64 bits tiene nada relevante para este espacio de direcciones (espacio de direcciones = cuánto 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 entonces puede parecer que el procesador de 32 bits significa que accederá a 2 ^ 32 bytes o 4 GB de memoria ... pero es solo una coincidencia y no será el mismo para todos ... por ejemplo, intel 8086 es un procesador de 16 bits (ya que tiene una ALU de 16 bits), por lo que 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 dirección de 20 bits ... Puede buscar en Google si tiene alguna duda :)
Creo que he dejado claro mi punto. Ahora que respondo a su pregunta ... ya que el procesador de 64 bits no significa que deba tener un bus de direcciones de 64 bits, por lo que no hay nada malo en 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 bytes) ... donde 2 ^ 48 bytes es más que suficiente hoy en día.
No es cierto que solo se utilicen los 48 bits de orden inferior de un VA de 64 bits, al menos con Intel 64. Los 16 bits superiores se utilizan, más o menos, algo así.
La Sección 3.3.7.1 El direccionamiento canónico en el Manual del desarrollador de software de las arquitecturas Intel® 64 e IA-32 dice:
una dirección canónica debe tener los bits 63 a 48 establecidos en ceros o en unos (dependiendo de si el bit 47 es cero o uno)
Por lo tanto, los bits 47 a 63 forman un súper bit, ya sea todos 1 o todos 0. Si una dirección no está en forma canónica, la implementación debería fallar.
En AArch64, esto es diferente. Según la descripción general 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 signos 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 / almacenamiento o el objetivo de una rama indirecta
Para responder a la pregunta original: no fue necesario agregar más de 48 bits de PA.
Los servidores necesitan la cantidad máxima de memoria, así que vamos a intentar profundizar más.
1) La configuración del servidor más grande (comúnmente utilizada) es un sistema de 8 sockets. Un sistema 8S no es más que 8 CPUs de servidor conectadas por una interconexión coherente de alta velocidad (o simplemente, un "bus" de alta velocidad) para formar un solo nodo. Hay grupos más grandes por ahí, pero son pocos y distantes entre sí, estamos hablando de configuraciones de uso común aquí. Tenga en cuenta que en los usos del mundo real, el sistema 2 Socket es uno de los servidores más utilizados, y 8S generalmente se considera de muy alto nivel.
2) Los principales tipos de memoria utilizados por los servidores son la memoria DRAM regular direccionable por bytes (p. Ej., La memoria DDR3 / DDR4), la IO asignada en memoria - MMIO (como la memoria utilizada por una tarjeta adicional), así como el espacio de configuración utilizado para configurar Los dispositivos que están presentes en el sistema. El primer tipo de memoria es el que suele ser el más grande (y, por lo tanto, necesita el mayor número de bits de dirección). Algunos servidores de gama alta también usan una gran cantidad de MMIO, dependiendo de cuál sea la configuración real del sistema.
3) Suponga que cada CPU del servidor puede alojar 16 módulos DIMM DDR4 en cada ranura. Con un tamaño máximo DDR4 DIMM de 256GB. (Dependiendo de la versión del servidor, este número de DIMM posibles por socket es en realidad menos de 16 DIMM, pero continúe leyendo por el ejemplo).
Por lo tanto, cada socket puede tener teóricamente 16 * 256 GB = 4096 GB = 4 TB. Para nuestro sistema de ejemplo 8S, el tamaño de la DRAM puede ser de un máximo de 4 * 8 = 32 TB. Esto significa que el número máximo de bits necesarios para tratar este espacio DRAM es 45 (= log2 32TB / log2 2).
No vamos a entrar en los detalles de los otros tipos de memoria (MMIO, MMCFG, etc.), pero el punto aquí es que el tipo de memoria más "exigente" para un sistema de 8 sockets con los tipos más grandes de DIMM DDR4 disponibles en la actualidad (256 GB DIMMs) utilizan solo 45 bits.
Para un sistema operativo que admita 48 bits (WS16 por ejemplo), quedan (48-45 =) 3 bits restantes. Lo que significa que si utilizamos los 45 bits inferiores únicamente para 32 TB de DRAM, todavía tenemos 2 ^ 3 veces de memoria direccionable que se puede usar para MMIO / MMCFG para un total de 256 TB de espacio direccionable.
Entonces, para resumir: 1) 48 bits de la dirección física son muchos bits para admitir los sistemas más grandes de la actualidad que están "completamente cargados" con cantidades abundantes de DDR4 y también muchos otros dispositivos IO que requieren espacio MMIO. 256 TB para ser exactos.
Tenga en cuenta que este espacio de direcciones de 256 TB (= 48 bits de dirección física) NO incluye ninguna unidad de disco como las unidades SATA porque NO son parte del mapa de direcciones, solo incluyen la memoria direccionable en bytes y está expuesta al sistema operativo.
2) El hardware de la CPU puede elegir implementar 46, 48 o> 48 bits dependiendo de la generación del servidor. Pero otro factor importante es la cantidad de bits que reconoce el sistema operativo. Hoy en día, WS16 admite direcciones físicas de 48 bits (= 256 TB).
Lo que esto significa para el usuario es que, aunque uno tiene una CPU de servidor grande y ultramoderna que puede admitir> 48 bits de direccionamiento, si ejecuta un sistema operativo que solo admite 48 bits de PA, entonces solo puede aprovechar 256 TB .
3) En general, hay dos factores principales para aprovechar un mayor número de bits de dirección (= más capacidad de memoria).
a) ¿Cuántos bits soporta tu CPU HW? (Esto puede ser determinado por la instrucción CPUID en las CPU de Intel).
b) ¿Qué versión de SO está ejecutando y cuántos bits de PA reconoce / admite?
El mínimo de (a, b) determinará en última instancia la cantidad de espacio accesible que su sistema puede aprovechar.
He escrito esta respuesta sin mirar las otras respuestas en detalle. Además, no he profundizado en los matices de MMIO, MMCFG y la totalidad de la construcción del mapa de direcciones. Pero espero que esto ayude.
Gracias, Anand K Enamandram, arquitecto de plataformas de servidor Intel Corporation
Porque eso es todo lo que se necesita. 48 bits le dan un espacio de direcciones de 256 terabytes. Eso es mucho. No vas a ver un sistema que necesite más que eso pronto.
Así que los fabricantes de CPU tomaron un atajo. Usan un conjunto de instrucciones que permite un espacio de direcciones completo 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 es cuestión de liberar CPU que manejen el espacio de direcciones completo, pero no requerirá ningún cambio en el conjunto de instrucciones y no interrumpirá la compatibilidad.
Una CPU se considera "N bits" principalmente en el tamaño de su bus de datos y en gran parte de sus entidades (arquitectura interna) : registros, acumuladores, unidad de lógica aritmética (ALU), conjunto de instrucciones, etc. Por ejemplo: La buena vieja Motorola 6800 (o Intel 8050) es una CPU de 8 bits. Tiene un bus de datos de 8 bits, una arquitectura interna de 8 bits y un bus de direcciones de 16 bits.
- Aunque la CPU de N bits puede tener otras entidades que no sean de tamaño N. Por ejemplo, los avances en el 6809 sobre el 6800 (ambos 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 podrían combinarse en un único registro de 16 bits, D), dos registros de índice de 16 bits (X, Y) y dos Apiladores de 16 bits.