¿Cómo puede el procesador de 8 bits admitir más de 256 bytes de RAM?

14

Si un procesador de 32 bits puede manejar aproximadamente 4 GiB de RAM (es decir, 232=4294967296 ) bytes, ¿por qué mi Arduino Mega 2560 tiene 8 KiB de SRAM, si ser un procesador de 8 bits le permite manejar solo 256? bytes ( 28 )? ¿O estoy leyendo mal la siguiente página?

http://www.atmel.com/devices/atmega2560.aspx?tab=parameters

ZaqueoAlejandro
fuente
55
Seguramente, cualquier máquina completa es capaz de abordar casi cualquier tamaño de ram, con el tiempo suficiente.
John U
2
En realidad, el número de bits en un nombre de procesador solo se puede usar para una estimación inicial del ancho de datos interno. El 8088 es un procesador de 16 bits debido a sus registros de 16 bits, pero tiene un bus de datos de 8 bits y un bus de direcciones de 20 bits. El 68000 es un procesador de 32 bits llamado principalmente 16/32 bits debido a sus registros de 32 bits, pero tiene un bus de datos de 16 bits y un bus de direcciones de 24 bits. Las implementaciones ARM pequeñas son procesadores de 32 bits (registros de 32 bits y bus de datos), pero incluso si usan 32 bits para direcciones, no pueden direccionar un total de 4 GB.
the busybee
He agregado los prefijos SI correctos para estas unidades. es gibi (Gi) y 2 10 es kibi (Ki). 230210
Elliot Alderson
Vale la pena mencionar que muchos 8 bitters (particularmente los derivados de Motorola) admiten una llamada página cero , que era un soporte de conjunto de instrucciones para manejar los primeros 256 bytes direccionables en el mapa de memoria un poco más rápido. Por lo tanto, los registros de hardware más críticos para el tiempo, etc., se asignarían a los primeros 256 bytes por este motivo de rendimiento. Esta es la razón por la que encontrará registros de hardware asignados desde la dirección cero en muchas arquitecturas.
Lundin hace
llamar a algo 8 bits, 16 bits, 32 bits, etc. es un término de marketing, los ingenieros lo usan pero entienden que eso no significa que todo en ese procesador sea tan amplio. algunas personas usan el tamaño de la instrucción, muy a menudo se usa el tamaño de los registros de propósito general, a veces el bus. tiene el contador del programa que no siempre es accesible o utilizable en las instrucciones para que pueda ser tan amplio como lo deseen. entonces, al igual que con muchos de los procesadores de tipo AVR, hay un registro múltiple o un esquema de paginación o ambos para obtener una dirección de carga / almacenamiento más amplia para las transacciones de datos.
old_timer hace

Respuestas:

19

La mayoría de las CPU de 8 bits tienen buses de direcciones de 16 bits que les permiten direccionar 64kbytes, precisamente porque 256 bytes realmente no es suficiente para hacer mucho. Simplemente significa que necesitan cargar dos bytes en lugar de uno, cada vez que necesitan cargar una dirección. Ligeramente más lento pero tolerable teniendo en cuenta su tamaño.

(Y sí, hay muchas excepciones, desarrolladas principalmente cuando 64k se volvió demasiado pequeño, pero estamos hablando de la idea básica aquí).

Brian Drummond
fuente
De hecho, la mayoría de los microcontroladores de 8 bits que he encontrado no tienen una dirección de 16 bits
phuclv
@Brian Drummond Estoy en lo correcto: el controlador escribirá primero 8 bits inferiores, luego 8 bits superiores y luego bloqueará el bus de direcciones. ¡Así es como accederá al bus de direcciones de 16 bits!
Swanand
O 8 bits superiores y luego 8 bits inferiores, pero básicamente sí, esa es la idea.
Brian Drummond
7

El bus de direcciones y el bus de datos están separados, por lo que pueden tener diferentes tamaños. Para cualquier tamaño de bus de dirección específico, existen muchas técnicas para direccionar más memoria que el ancho de bit de registro

  • La forma más común es aumentar el ancho del bus de direcciones de alguna manera

    • usando múltiples registros para la dirección

      • AVR tiene R26..R31 que puede ser emparejado en 16 bits X, Yy Zdatos de direccionamiento registros para permitir el máximo de 64 KB de RAM. Los que a su vez se puede combinar con RAMPX, RAMPY, RAMPZpara acceder a las direcciones de memoria RAM más altos en las versiones aún más grandes. También tiene SPHpara los bytes altos del puntero de la pila, además de las SPLvariantes con más de 256 bytes de RAM 1
      • Intel 8080 y Zilog Z80 son CPU de 8 bits, pero tienen pares de registro como H& L, B& C, Dy Eque se pueden usar juntos como un registro de dirección de 16 bits
    • utilizando un único registro especial grande más grande que el tamaño natural para abordar

      • Intel 8051 es un microcontrolador de 8 bits, es decir, tiene una dirección de datos de 8 bits. Sin embargo, utiliza una dirección de instrucción de 16 bits y tiene 2 registros de 16 bits: PC y DPTR para direccionar en el espacio de instrucciones.
      • AVR tiene un registro de PC de 16 o 22 bits
    • utilizando un registro especial para la parte alta de la dirección . Al direccionar alguna memoria, de manera predeterminada, los 8 bits bajos de la dirección se tomarán del registro inmediato de 8 bits o del registro de 8 bits en un microcontrolador de 8 bits, mientras que los bits altos se reemplazarán por el valor del otro registro de dirección.

      • Un caso especial de esto es la memoria segmentada , que es utilizada por el x86 de 16 bits . En esta técnica, la memoria se divide en múltiples segmentos de tamaño 64 KB (2 16 bytes). El acceso normal está dentro de un solo segmento de forma predeterminada, por lo que pueden usar una dirección de 16 bits para datos cercanos . Los datos que están más separados deben tratarse específicamente por valor de segmento, por lo tanto, 2 registros deben usarse para el direccionamiento lejano.
      • El microcontrolador PIC , cuyas series de referencia y de rango medio pueden tener una dirección de 13 o 14 bits, es otro ejemplo. Cuando se usa callogoto instrucción, 8 o 9 bits bajos de la dirección se indican por el inmediato y el resto se toma del contador del programa actual. Por lo tanto, acceder a cualquier cosa que no esté muy cerca del segmento actual usa solo 1 instrucción, mientras que otras direcciones necesitarán 2 instrucciones (para establecer los bits altos).
      • Otro ejemplo es la arquitectura MIPS que también combina la dirección inmediata inferior de 26 bits con los 6 bits altos de PCmientras salta incondicionalmente.
  • Otra forma de lograr esto es la memoria bancaria . Este es un método útil que todavía se usa en algunas arquitecturas hoy en día. En este modelo, la memoria se divide en múltiples bancos . Cada vez solo puede dirigirse a un banco específico. A menudo hay un banco global o un rango de direcciones que siempre están visibles en cualquier momento, pero para otras partes debe cambiar de banco cuando sea necesario.

    • Intel 8051 utiliza el banco de memoria para los registros. Tiene 32 registros, pero solo 8 de ellos son visibles a la vez.
    • x86 PAE y ARM LPAE , con un mayor espacio de direcciones físicas asignado a un pequeño espacio de direcciones virtuales
    • Otra aplicación para esto es las extensiones de ventana de dirección de ventanas de en Windows que pueden ser utilizadas por aplicaciones x86 de 32 bits en modo PAE para acceder a más de 2 / 3GB de memoria. No es exactamente como un banco de memoria en microcontroladores, pero se puede ver como tal, porque el gran rango de direcciones puede pensar en ventanas / bancos pequeños que son lo suficientemente pequeños como para caber en el espacio de direcciones de la aplicación. Si la aplicación necesita usar datos en alguna ventana, asignará esa ventana a su espacio de direcciones actual.
    • DOS también tiene algunos tipos de cambio de banco como memoria expandida o memoria extendida debido a su rango limitado de memoria direccionable.
  • También hay una técnica no bastante común, pero se puede encontrar en el Intel 8051 . Como microcontrolador con dirección de datos de 8 bits, puede tener como máximo 256 direcciones. La mitad del espacio (la parte alta) se usa para registros de funciones especiales ( SFR ), lo que limita la RAM real direccionable a solo 128 bytes. Sin embargo, los fabricantes modernos de la serie 8051 encontraron una manera inteligente de superar esto separando el acceso a la memoria . El direccionamiento directo accederá al SFR mientras que el direccionamiento indirecto, aunque los registros accederán a la parte alta de RAM, lo que significa que ahora tiene 256 + 128 = 384 bytes direccionables.


1 https://en.wikipedia.org/wiki/Atmel_AVR_instruction_set#Memory_addressing_instructions

Los núcleos más pequeños tienen ≤256 bytes de espacio de dirección de datos (es decir, ≤128 bytes de RAM después de que se eliminan los puertos de E / S y otras direcciones reservadas) y ≤8192 bytes (8 KiB) de la ROM del programa. Estos tienen solo un puntero de pila de 8 bits (en SPL) y solo admiten las instrucciones de salto / llamada relativas de 12 bits RJMP / RCALL. (Debido a que el contador del programa AVR cuenta palabras de 16 bits, no bytes, un desplazamiento de 12 bits es suficiente para direccionar 213 bytes de ROM).

Las capacidades adicionales de direccionamiento de memoria están presentes según sea necesario para acceder a los recursos disponibles:

  1. Los modelos con> 256 bytes de espacio de dirección de datos (≥256 bytes de RAM) tienen un puntero de pila de 16 bits, con la mitad alta en el registro SPH.
  2. Los modelos con> 8 KiB de ROM agregan las instrucciones JUMP y CALL de 2 palabras (22 bits). (Algunos modelos anteriores sufren una errata si una instrucción de salto es seguida por una instrucción de 2 palabras).
  3. Los modelos con> 64 KiB de ROM agregan la instrucción ELPM y el registro RAMPZ correspondiente. Las instrucciones LPM extienden a cero la dirección ROM en Z; Las instrucciones ELPM anteponen el registro RAMPZ para bits altos. Esto no es lo mismo que la instrucción LPM más general; existen modelos "clásicos" con solo la forma de cero operando de ELPM (ATmega103 y at43usb320). Cuando el incremento automático está disponible (la mayoría de los modelos), actualiza la dirección completa de 24 bits, incluida RAMPZ.
  4. Los modelos (raros) con> 128 KiB de ROM tienen un contador de programa de 3 bytes. Las llamadas y devoluciones de subrutina usan un byte adicional de espacio de pila, hay un nuevo registro EIND para proporcionar bits altos adicionales para saltos y llamadas indirectos, y hay nuevas instrucciones extendidas EIJMP y EICALL que usan EIND: Z como la dirección de destino. (Las instrucciones IJMP e ICALL anteriores usan Z con extensión cero).
  5. Los modelos (raros) con> 64 KiB de espacio de direcciones RAM amplían los límites de direccionamiento RAM de 16 bits con registros RAMPX, RAMPY, RAMPZ y RAMPD. Estos proporcionan bits altos adicionales para modos de direccionamiento que utilizan los pares de registro X, Y o Z, respectivamente, o las instrucciones de direccionamiento directo LDS / STS. A diferencia del acceso a ROM, no hay instrucciones "extendidas" distintas; en cambio, los registros RAMP se usan incondicionalmente.
phuclv
fuente
6

Casi todos los procesadores de 8 bits tienen cierta capacidad para formar una dirección de 16 bits a partir de una parte de orden inferior y una parte de orden superior. En algunos procesadores, incluido el 8080 original, hay registros dedicados a mantener la parte superior e inferior de una dirección (aunque desde el punto de vista del programador puede haber algunos registros como el puntero de pila del 8080 que no ofrecen instrucciones para abordarlos por separado). En algunos otros procesadores, no hay registros dedicados a la mitad superior o inferior de una dirección, sino que las direcciones se ensamblan "sobre la marcha". Por ejemplo, en el 6502, la instrucción "LDA $ 1234, X" carga el acumulador con la dirección formada al agregar $ 1234 al registro X de 8 bits [supongamos que contiene $ F0]. La ejecución de esa instrucción procedería en 4 o 5 pasos:

  1. Termine la escritura de registro de las instrucciones anteriores (si corresponde) y cargue el código de operación ($ BD)
  2. Obtenga el primer byte de operando después del código de operación ($ 34) mientras decodifica las instrucciones
  3. Obtener el segundo byte de operando ($ 12) mientras agrega el byte obtenido previamente al registro X
  4. Lea la memoria en la dirección formada al concatenar el segundo byte operando al resultado ALU [es decir, $ 1224]. Alimente el segundo byte operando en ALU para agregar cero o uno, dependiendo de si la adición previa generó un acarreo
  5. Lea la memoria en la dirección formada al reemplazar la mitad superior con el resultado ALU [$ 1334]

La transferencia del byte de lectura al acumulador se superpondrá a la obtención de la siguiente instrucción. Además, para muchas operaciones, si el paso 3 no generó un carry, el paso 4 habría leído la dirección correcta y la ejecución podría pasar directamente del paso 4 a la siguiente instrucción, sin pasar por el paso 5.

Si uno examina la secuencia de operaciones, notará que una arquitectura little-endian tiene una ventaja definitiva sobre una big-endian, en la mayoría de los casos (aunque no la que se muestra), aunque la ALU toma un ciclo para realizar Además, es posible leer un byte de la dirección calculada sin esperar el resultado de la ALU, ya que normalmente el byte alto que se obtuvo será el byte alto del operando de destino. En una máquina big-endian con una ALU de 8 bits, una carga indexada tomaría al menos 5 ciclos (ya que la mitad inferior de la dirección no se leería hasta el paso 3 y, por lo tanto, se calcularía en el paso 4).

Super gato
fuente
Recuerdo haber visto algunos anuncios para computadoras con procesadores de 8 bits y 1 megabyte de memoria. Esto se realizó mediante el uso de dos registros de 8 bits en la CPU más un registro de 8 bits que no está en la CPU para formar la dirección completa.
user6030
@ user6030: Hay muchas formas de lograr tales cosas. Típicamente, partes del espacio de direcciones serán "fijas" y otras serán seleccionables por el banco. Algunos dispositivos funcionan bien para los programadores; muchos otros, no tanto.
supercat
6

Las líneas de datos (pines) y las líneas de direcciones (pines) están completamente separadas. En pocas palabras, las líneas de bus de datos determinan el número máximo de bits que se pueden transferir de a uno por vez (y se almacenan en la memoria), mientras que las líneas de dirección determinan el número máximo de "celdas" de memoria que se pueden seleccionar.

Era principalmente una cuestión de marketing que las CPU x86 de 32 bits no podían abordar más de 4 GB de RAM. Recuerdo en alguna parte que había pines A33-34 en las CPU Pentium 4.

dprogrammer
fuente
1
Estás en lo correcto: PAE permitió el uso de más RAM, pero como no estaba disponible en el escritorio de Windows, mucha gente nunca lo usó.
pjc50
264
Las CPU x86 no pueden abordar más de 4 GB sin complicaciones significativas en el sistema operativo que no se transfieren a otras arquitecturas.
Kaz
1
@Kaz ARM de 32 bits tiene una característica similar llamada LPAE, que permite al sistema operativo direccionar más de 32 bits de dirección
phuclv
3

A menudo es cierto que existe alguna relación entre el tamaño de memoria direccionable y el tamaño del registro interno, aunque la relación varía por diferentes razones. 256 bytes de espacio de direcciones se consideraban demasiado pequeños incluso en los primeros días de los microprocesadores, por lo que la mayoría de los procesadores de ocho bits producían direcciones de 16 bits (dos bytes), que se dirigían a 64 kilobytes. Sin embargo, con el cambio de banco (esencialmente usando ciertas líneas de E / S para producir aún más líneas de dirección), era posible tener mucho más.

En los primeros procesadores de 16 y 32 bits, no siempre había suficientes pines en el dispositivo para alcanzar todo el espacio que sus registros de direcciones internas podían abordar. Por ejemplo, en el Motorola 68000, solo había suficientes pines de dirección (24) para direccionar 16 megabytes de RAM, aunque los registros de direcciones internas tenían 32 bits de ancho.

Gus Mueller
fuente
2

Contestaré esta pregunta específicamente para los controladores AVR que mencionaste. El principio básico también es válido para muchas otras arquitecturas de 8 bits.

Los AVR son núcleos de 8 bits. Esto significa que tienen registros de 8 bits. Sin embargo, 8 bits no son suficientes para acceder a una cantidad de memoria utilizable. Por lo tanto, el núcleo AVR puede usar un conjunto específico de registros combinados como registros de puntero de 16 bits. Los registros r30 y r31 (también alias como ZL y ZH) son un ejemplo de esto. Juntos forman el Z Pointer.

En la asamblea, leer un byte en la dirección 0x1234 se vería así:

ldi ZL, 0x34 ; Load r30 (ZL) with low byte of address
ldi ZH, 0x12 ; Load r31 (ZH) with high byte of address
ld r16, Z    ; Load byte to r16

La familia AVR tiene 3 pares de registros que pueden usarse para esto. Están específicamente diseñados en hardware para permitir tales operaciones.

Al programar en un lenguaje de nivel superior como C, el compilador maneja estas cosas.


Nota: Algunos AVR incluso admiten tamaños de memoria mayores que 64k. Estos controladores tienen un registro de función especial en el que se escriben bits adicionales de la dirección antes del acceso. Por lo tanto, la dirección consta de los siguientes bits (MSB a LSB):

Registro de funciones especiales (generalmente 1 byte), ZH (8 bits), ZL (8 bits).

GNA
fuente
1

Los AVR de 8 bits de Atmel en realidad usan una dirección de datos de 16 bits. Tienen muchos otros registros de 16 bits e incluso algunos temporizadores de 16 bits. Como solo es un procesador de 8 bits, generalmente utiliza dos ciclos de reloj para cargar un registro de 16 bits.

Garrett Fogerlie
fuente
1

Wikipedia lo explica bastante bien:

Las CPU de ocho bits utilizan un bus de datos de 8 bits y, por lo tanto, pueden acceder a 8 bits de datos en una sola instrucción de máquina. El bus de direcciones suele tener un ancho de doble octeto (es decir, 16 bits), debido a consideraciones prácticas y económicas. Esto implica un espacio de direcciones directo de solo 64 KB en la mayoría de los procesadores de 8 bits.

Kamil
fuente
1

La noción de que el "ancho de bits" de un procesador establece la cantidad máxima de RAM que el procesador puede abordar es uno de los mitos más generalizados en la informática. De hecho, la historia de la industria está llena de CPU para las cuales esta relación no se mantuvo.

HP 21MX, HP 1000: CPU de 16 bits, memoria hasta 16 MB

PDP-11: CPU de 16 bits, memoria de 4 MB

VAX-11/780: CPU de 32 bits, memoria a 512 MB

etcétera etcétera.

Jamie Hanrahan
fuente