En un libro leí 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.
Entonces me preguntaba cuál es la razón de esta limitación.
The 32-bit processors have 2^32 possible addresses
no es necesariamente cierto, puede existir una CPU de 32 bits con solo 24 "pines" para direccionar la memoria. Por ejemplo, 68EC020 (versión 68020 más barata) es una cpu de 32 bits pero con 24 bits para direccionar la memoria.Respuestas:
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 en el corto plazo.
Entonces, 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 inferiores. La alternativa era desperdiciar transistores para manejar un espacio de direcciones más grande que no sería 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 romperá la compatibilidad.
fuente
Cualquier respuesta que se refiera al tamaño del bus y la memoria física está ligeramente equivocada, ya que la pregunta de OP era sobre el espacio de direcciones virtuales, 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 el espacio de direcciones virtuales, que siempre era de 32 bits completos. En principio, podría utilizar 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 mapear 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 estaba siendo barata y esperaba que a nadie le importara ahora, pero no tengo referencias para citar.
fuente
__far
(o peor aún,FAR
/far
!) Punteros ...Lea la sección de limitaciones del artículo de wikipedia :
Es decir, no tiene sentido implementar el direccionamiento completo de 64 bits en este punto, porque no podemos construir un sistema que pueda utilizar un espacio de direcciones de este tipo en su totalidad, por lo que elegimos algo que sea práctico para los sistemas de hoy (y del mañana).
fuente
El registro nativo interno / ancho de operación no necesita reflejarse en el ancho del bus de 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 necesita. ¿Por qué preocuparse por el costo y la complejidad del hardware de todos los pines adicionales que no utilizará?
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 a la memoria (cada uno con 16 bits de datos).
fuente
Existe una razón más grave que simplemente guardar transistores en la ruta de 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 página o tener una estructura de tabla de 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 perjudica el rendimiento.
fuente
Desde mi punto de vista, esto es el resultado del tamaño de la página. Cada página contiene como máximo 4096/8 = 512 entradas de la tabla de páginas. Y 2 ^ 9 = 512. Entonces 9 * 4 + 12 = 48.
fuente
Para responder a la pregunta original: no era necesario agregar más de 48 bits de PA.
Los servidores necesitan la máxima cantidad de memoria, así que intentemos profundizar más.
1) La configuración de servidor más grande (de uso común) es un sistema de 8 sockets. Un sistema 8S no es más que 8 CPU de servidor conectadas por una interconexión coherente de alta velocidad (o simplemente, un "bus" de alta velocidad) para formar un solo nodo. Hay clústeres más grandes 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 el 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., Memoria DDR3 / DDR4), IO mapeada 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 la que suele ser la más grande (y por lo tanto necesita la mayor cantidad de bits de dirección). Algunos servidores de gama alta también utilizan una gran cantidad de MMIO, dependiendo de cuál sea la configuración real del sistema.
3) Suponga que cada CPU de servidor puede albergar 16 DIMM DDR4 en cada ranura. Con un tamaño máximo DDR4 DIMM de 256GB. (Dependiendo de la versión del servidor, esta cantidad de DIMM posibles por socket es en realidad menor que 16 DIMM, pero continúe leyendo por el bien del ejemplo).
Entonces, cada zócalo puede tener teóricamente 16 * 256GB = 4096GB = 4 TB. Para nuestro ejemplo de sistema 8S, el tamaño de la DRAM puede ser un máximo de 4 * 8 = 32 TB. Esto significa que el número máximo de bits necesarios para direccionar este espacio DRAM es 45 (= log2 32TB / log2 2).
No entraremos en 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 DIMM) utilizan solo 45 bits.
Para un sistema operativo que admite 48 bits (WS16 por ejemplo), hay (48-45 =) 3 bits restantes. Lo que significa que si usamos 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 dirección física son muchos bits para admitir los sistemas más grandes de hoy que están "completamente cargados" con copiosas cantidades de DDR4 y también muchos otros dispositivos IO que exigen 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 unidades de disco como unidades SATA porque NO forman parte del mapa de direcciones, solo incluyen la memoria que es direccionable por bytes y está expuesta al sistema operativo.
2) El hardware de la CPU puede optar por implementar 46, 48 o> 48 bits dependiendo de la generación del servidor. Pero otro factor importante es cuántos bits 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, 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 admite su CPU HW? (Esto se puede determinar mediante la instrucción CPUID en las CPU Intel).
b) Qué versión del sistema operativo está ejecutando y cuántos bits de PA reconoce / admite.
El mínimo de (a, b) determinará en última instancia la cantidad de espacio direccionable que su sistema puede aprovechar.
He escrito esta respuesta sin analizar 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 plataforma de servidor Intel Corporation
fuente
Mucha gente tiene esta idea errónea. Pero te prometo que si lees esto con atención, después de leerlo, todos tus 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! ... ¡Repito que NO!
El procesador de 32 bits significa que tiene ALU (Unidad Aritmética y Lógica) de 32 bits ... 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 un binario de 64 bits operando. Por lo tanto, un procesador de 32 bits o 64 bits NO significa que se puede instalar la cantidad máxima de memoria. Simplemente muestran cuán 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 o cualquier otro resultado más grande ... aunque es en decimal, pero estoy diciendo esta analogía para simplificar) ... pero lo que está diciendo es el espacio de direcciones que es el tamaño máximo de memoria (RAM) directamente interconectable. El carnero' El tamaño máximo posible 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 bits). Sí, si un procesador tiene un "bus de direcciones" de 32 bits, entonces puede direccionar 2 ^ 32 bytes = 4 GB de RAM (o para 64 bits será 2 ^ 64) ... pero decir que un procesador de 32 bits o 64 bits tiene nada relevante para este espacio de direcciones (espacio de direcciones = hasta qué punto 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 luego 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á lo mismo para todos.... por ejemplo, Intel 8086 es un procesador de 16 bits (ya que tiene ALU de 16 bits), por lo que, como dice, 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 ... Puedes buscar en Google si tienes alguna duda :)
Creo que he dejado claro mi punto. Ahora, llegando 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 de 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.
fuente
No es cierto que solo se usen los 48 bits de orden bajo de un VA de 64 bits, al menos con Intel 64. Los 16 bits superiores se usan, más o menos.
La sección 3.3.7.1 Direccionamiento canónico en el Manual del desarrollador de software de arquitecturas Intel® 64 e IA-32 dice:
Entonces, los bits 47 a 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 fallar.
En AArch64, esto es diferente. De acuerdo con la descripción general del conjunto de instrucciones ARMv8 , es un VA de 49 bits.
fuente
[vsyscall]
página. (Eso puede ser exportar cosas como el PID actual, por lo quegetpid()
es puramente espacio de usuario. Tambiéngettimeofday()
puede usar rdtsc en espacio de usuario + factores de escala exportados por el kernel. Aunque creo que algo de eso es[vdso]
, que está cerca de la parte superior de la mitad inferior.)__VMALLOC_BASE
hace. Es de suponer que no se usa directamente.Una CPU se considera "N-bits" principalmente por el tamaño de su bus de datos y por gran parte de sus entidades (arquitectura interna) : registros, acumuladores, unidad aritmética-lógica (ALU), conjunto de instrucciones, etc. Por ejemplo: La vieja CPU 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.
fuente