Como o processador de 8 bits suporta mais de 256 bytes de RAM?

14

Se um processador de 32 bits pode lidar com aproximadamente 4 GiB de RAM (ou seja, 232=4294967296 ) bytes, por que meu Arduino Mega 2560 possui 8 KiB de SRAM, se um processador de 8 bits permite lidar com apenas 256 bytes ( 28 )? Ou estou lendo a página a seguir errado?

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

ZaqueoAlejandro
fonte
5
Certamente, qualquer máquina completa de turing é capaz de lidar com praticamente qualquer tamanho de ram, com tempo suficiente.
John U
1
Na verdade, o número de bits no nome de um processador pode ser usado apenas para uma estimativa inicial da largura dos dados internos. O 8088 é um processador de 16 bits por causa de seus registros de 16 bits, mas possui um barramento de dados de 8 bits e um barramento de endereço de 20 bits. O 68000 é um processador de 32 bits chamado principalmente de 16/32 bits por causa de seus registros de 32 bits, mas possui um barramento de dados de 16 bits e um barramento de endereço de 24 bits. As implementações pequenas do ARM são processadores de 32 bits (registradores de 32 bits e barramento de dados), mas mesmo que usem 32 bits para endereços, não podem endereçar um total de 4 GB.
the busybee 12/12/19
Adicionei os prefixos de SI corretos para essas unidades. é gibi (Gi) e 2 10 é kibi (Ki). 230210
Elliot Alderson

Respostas:

18

A maioria das CPUs de 8 bits possui barramentos de endereço de 16 bits, o que lhes permite endereçar 64kbytes, precisamente porque 256 bytes realmente não são suficientes para fazer muito! Significa apenas que eles precisam carregar dois bytes em vez de um, cada vez que precisam carregar um endereço. Um pouco mais lento, mas tolerável, considerando seu tamanho.

(E sim, existem muitas exceções, desenvolvidas principalmente quando 64k se tornaram muito pequenos, mas estamos falando da idéia básica aqui).

Brian Drummond
fonte
Na verdade a maioria dos microcontroladores de 8 bits que eu encontrei não têm 16-bit endereço
phuclv
Brian Drummond Estou correto: o controlador grava primeiro 8 bits inferiores e depois 8 bits superiores e depois trava o barramento de endereços. É assim que ele acessará o barramento de endereços de 16 bits!
Swanand
Ou superior a 8 bits e depois inferior a 8 bits, mas basicamente sim, essa é a ideia.
Brian Drummond
7

O barramento de endereços e o barramento de dados são separados para que possam ter tamanhos diferentes. Para qualquer tamanho de barramento de endereço específico, existem muitas técnicas para endereçar mais memória do que a largura de bit do registro

  • A maneira mais comum é aumentar a largura do barramento de endereço de alguma forma

    • usando vários registros para o endereço

      • AVR tem R26..R31 que pode ser emparelhado em 16-bit X, Ye Zendereçamento de dados registros para permitir 64KB máximo de RAM. Aqueles, por sua vez pode ser emparelhado com RAMPX, RAMPY, RAMPZacessar endereços de RAM mais elevados em versões ainda maiores. Ele também possui SPHos bytes altos do ponteiro da pilha, além de SPLvariantes com mais de 256 bytes de RAM 1
      • Intel 8080 e Zilog Z80 são CPUs de 8 bits, mas possuem pares de registradores como H& L, B& C, D& Eque podem ser usados ​​juntos como um registrador de endereços de 16 bits
    • usando um único grande registro especial maior que o tamanho natural para tratar

      • Intel 8051 é um microcontrolador de 8 bits, ou seja, possui um endereço de dados de 8 bits. No entanto, ele usa o endereço de instrução de 16 bits e possui 2 registradores de 16 bits: PC e DPTR para endereçamento no espaço de instruções.
      • O AVR possui um registro de PC de 16 ou 22 bits
    • usando um registro especial para a parte alta do endereço . Ao endereçar alguma memória, por padrão, os 8 bits baixos do endereço serão obtidos do registro imediato de 8 bits ou de 8 bits em um microcontrolador de 8 bits, enquanto os bits altos serão substituídos pelo valor do outro registro de endereço.

      • Um caso especial disso é a memória segmentada , usada pelo x86 de 16 bits . Nesta técnica, a memória é dividida em vários segmentos de tamanho 64 KB (2 16 bytes). O acesso normal está dentro de um único segmento por padrão, para que eles possam usar o endereço de 16 bits para dados próximos . Dados que estão mais afastados devem ser endereçados especificamente pelo valor do segmento; portanto, 2 registros devem ser usados ​​para endereçamento remoto.
      • O microcontrolador PIC , cuja linha de base e séries médias podem ter endereço de 13 ou 14 bits, é outro exemplo. Ao usar callou gotoinstrução, 8 ou 9 bits baixos do endereço são indicados pelo imediato e o restante é retirado do contador atual do programa. Portanto, acessar qualquer coisa não muito distante do segmento atual usa apenas 1 instrução, enquanto endereços adicionais precisarão de 2 instruções (para definir os bits mais altos).
      • Outro exemplo é a arquitetura MIPS , que também combina o endereço imediato inferior de 26 bits com os altos 6 bits de PCum salto incondicional.
  • Outra maneira de conseguir isso é o banco de memória . Esse é um método útil ainda usado em algumas arquiteturas atualmente. Nesse modelo, a memória é dividida em vários bancos . Cada vez que você pode endereçar apenas um banco específico. Geralmente, existe um banco global ou um intervalo de endereços sempre visível a qualquer momento, mas para outras partes, você deve trocar de banco quando necessário.

    • O Intel 8051 usa banco de memória para os registros. Possui 32 registros, mas apenas 8 deles são visíveis por vez.
    • x86 PAE e ARM LPAE , com maior espaço de endereço físico mapeado para um pequeno espaço de endereço virtual
    • Outro aplicativo para isso é o Address Windowing Extensions no Windows, que pode ser usado por aplicativos x86 de 32 bits no modo PAE para acessar mais de 2/3 GB de memória. Não é exatamente como um banco de memória em microcontroladores, mas pode ser visto como tal, porque o grande intervalo de endereços pode ser pensado em pequenas janelas / bancos pequenos o suficiente para caber no espaço de endereço do aplicativo. Se o aplicativo precisar usar dados em alguma janela, ele a mapeará em seu espaço de endereço atual.
    • O DOS também possui alguns tipos de comutação de banco, como memória expandida ou memória estendida devido ao seu intervalo limitado de memória endereçável.
  • Também existe uma técnica não muito comum, mas pode ser encontrada no Intel 8051 . Como um microcontrolador com endereço de dados de 8 bits, ele pode ter no máximo 256 endereços. Metade do espaço (a parte mais alta) é usada para registros de função especial ( SFR ), limitando a RAM real endereçável a apenas 128 bytes. No entanto, os fabricantes modernos da série 8051 encontraram uma maneira inteligente de superar isso separando o acesso à memória . O endereçamento direto acessará o SFR enquanto o endereçamento indireto, embora os registradores acessem a parte alta da RAM, o que significa que agora você tem 256 + 128 = 384 bytes endereçáveis.


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

Os núcleos menores possuem ≤256 bytes de espaço para endereço de dados (ou seja, ≤128 bytes de RAM após a remoção das portas de E / S e outros endereços reservados) e ≤8192 bytes (8 KiB) da ROM do programa. Eles possuem apenas um ponteiro de pilha de 8 bits (em SPL) e suportam apenas as instruções de salto / chamada relativas de 12 bits RJMP / RCALL. (Como o contador do programa AVR conta palavras de 16 bits, não bytes, um deslocamento de 12 bits é suficiente para endereçar 213 bytes de ROM.)

Recursos adicionais de endereçamento de memória estão presentes conforme necessário para acessar os recursos disponíveis:

  1. Modelos com> 256 bytes de espaço para endereço de dados (≥256 bytes de RAM) possuem um ponteiro de pilha de 16 bits, com a metade alta no registro SPH.
  2. Modelos com> 8 KiB de ROM adicionam as instruções JUMP e CALL de 2 palavras (22 bits). (Alguns modelos antigos sofrem uma errata se uma instrução de salto for seguida por uma instrução de duas palavras.)
  3. Modelos com> 64 KiB de ROM adicionam a instrução ELPM e o registro RAMPZ correspondente. As instruções do LPM estendem zero o endereço da ROM em Z; As instruções do ELPM precedem o registro RAMPZ em bits altos. Isso não é a mesma coisa que a instrução LPM mais geral; existem modelos "clássicos" apenas com a forma de operando zero do ELPM (ATmega103 e at43usb320). Quando o incremento automático está disponível (na maioria dos modelos), ele atualiza todo o endereço de 24 bits, incluindo RAMPZ.
  4. Os modelos (raros) com> 128 KiB de ROM possuem um contador de programa de 3 bytes. Chamadas e retornos de sub-rotina usam um byte adicional de espaço na pilha, há um novo registro EIND para fornecer bits altos adicionais para saltos e chamadas indiretos, e há novas instruções estendidas EIJMP e EICALL que usam EIND: Z como o endereço de destino. (As instruções IJMP e ICALL anteriores usam Z estendido a zero.)
  5. Modelos (raros) com> 64 KiB de espaço de endereço RAM estendem os limites de endereçamento de 16 bits da RAM com os registros RAMPX, RAMPY, RAMPZ e RAMPD. Eles fornecem bits altos adicionais para modos de endereçamento que usam os pares de registradores X, Y ou Z, respectivamente, ou as instruções de endereçamento direto LDS / STS. Ao contrário do acesso à ROM, não há instruções "estendidas" distintas; em vez disso, os registros RAMP são usados ​​incondicionalmente.
phuclv
fonte
6

Quase todos os processadores de 8 bits têm alguma capacidade de formar um endereço de 16 bits a partir de uma parte de ordem baixa e uma parte de ordem alta. Em alguns processadores, incluindo o 8080 original, há registros dedicados a manter a parte superior e inferior de um endereço (embora, do ponto de vista de um programador, possa haver alguns registros, como o ponteiro de pilha do 8080, que não oferecem instruções para abordá-los separadamente). Em alguns outros processadores, não há registros dedicados à metade superior ou inferior de um endereço, mas os endereços são montados "em tempo real". Por exemplo, no 6502, a instrução "LDA $ 1234, X" carrega o acumulador com o endereço formado adicionando $ 1234 ao registro X de 8 bits [suponha que ele contenha $ F0]. A execução dessa instrução continuaria em 4 ou 5 etapas:

  1. Conclua a gravação do registro da instrução anterior (se houver) e carregue o código de operação ($ BD)
  2. Busque o primeiro byte do operando após o opcode ($ 34) enquanto decodifica as instruções
  3. Busque o segundo byte de operando (US $ 12) ao adicionar byte previamente buscado ao registro X
  4. Leia a memória no endereço formado concatenando o segundo byte do operando com o resultado da ALU [ou seja, US $ 1224]. Alimente o segundo byte do operando na ALU para adicionar zero ou um, dependendo se a adição anterior gerou um carry
  5. Leia a memória no endereço formado substituindo a metade superior pelo resultado da ALU [$ 1334]

A transferência do byte de leitura para o acumulador se sobrepõe à busca da próxima instrução. Além disso, para muitas operações, se a etapa 3 não gerasse um transporte, a etapa 4 teria lido o endereço correto e a execução poderia pular diretamente da etapa 4 para a próxima instrução, ignorando a etapa 5.

Se examinarmos a sequência de operações, notamos que uma arquitetura little-endiana tem uma vantagem definida sobre uma arquitetura big-endian, na maioria dos casos (embora não seja a mostrada), mesmo que a ULA tenha um ciclo para executar Além disso, é possível ler um byte do endereço calculado sem aguardar o resultado da ALU, pois normalmente o byte alto buscado será o byte alto do operando de destino. Em uma máquina big endian com uma ALU de 8 bits, uma carga indexada levaria pelo menos 5 ciclos (uma vez que a metade inferior do endereço não seria lida até a etapa 3 e, portanto, seria computada na etapa 4).

supercat
fonte
Lembro-me de ver alguns anúncios para computadores com processadores de 8 bits e 1 megabyte de memória. Isso foi feito usando dois registradores de 8 bits na CPU e um registrador de 8 bits que não está na CPU para formar o endereço inteiro.
user6030
@ user6030: Existem muitas maneiras de realizar essas coisas. Normalmente, partes do espaço de endereço serão "fixas" e outras serão selecionadas pelo banco. Alguns dispositivos funcionam bem para programadores; muitos outros, nem tanto.
precisa
6

As linhas de dados (pinos) e as linhas de endereço (pinos) são completamente separadas. Simplificando, as linhas de dados determinam o número máximo de bits que podem ser transferidos um de cada vez (e armazenados na memória), enquanto as linhas de endereço determinam o número máximo de "células" de memória que podem ser selecionadas.

Era principalmente uma questão de marketing que as CPUs x86 de 32 bits não conseguiam lidar com mais de 4 GB de RAM. Lembro-me em algum lugar que havia pinos A33-34 nas CPUs Pentium 4.

programador
fonte
1
Você está correto - o PAE permitiu o uso de mais RAM, mas como não estava disponível no Windows para desktop, muitas pessoas nunca o usaram.
Pjc50
PAE é o nome do recurso. Além disso, os processadores de 64 bits não podem endereçar 64 exabytes, pois264sugeriria.
Phil Frost
As CPUs x86 não podem endereçar mais de 4 GB sem complicações significativas no sistema operacional que não são portadas para outras arquiteturas.
Kaz
1
@Kaz ARM de 32 bits tem uma característica semelhante chamado LPAE, que permite que o sistema operacional para o endereço mais de 32 bits de endereço
phuclv
3

Geralmente, é verdade que existe algum relacionamento entre o tamanho da memória endereçável e o tamanho do registro interno, embora o relacionamento varie por diferentes razões. 256 bytes de espaço de endereço eram considerados muito pequenos, mesmo nos primeiros dias dos microprocessadores; portanto, a maioria dos processadores de oito bits produzia endereços de 16 bits (dois bytes), que endereçavam 64 kilobytes. Com a troca de banco, no entanto (essencialmente usando certas linhas de E / S para produzir ainda mais linhas de endereço), era possível ter muito mais.

Nos primeiros processadores de 16 e 32 bits, nem sempre havia pinos suficientes no dispositivo para atingir todo o espaço que seus registradores de endereços internos podiam endereçar. Por exemplo, no Motorola 68000, havia apenas pinos de endereço (24) suficientes para endereçar 16 megabytes de RAM, embora os registradores de endereços internos tivessem 32 bits de largura.

Gus Mueller
fonte
2

Vou responder a essa pergunta especificamente para os controladores AVR que você mencionou. O princípio básico também é válido para muitas outras arquiteturas de 8 bits.

AVRs são núcleos de 8 bits. Isso significa que eles têm registradores de 8 bits. No entanto, 8 bits não são suficientes para acessar uma quantidade utilizável de memória. Portanto, o núcleo do AVR pode usar um conjunto específico de registros combinados como registros de ponteiro de 16 bits. Os registros r30 e r31 (também conhecido como ZL e ZH) são um exemplo disso. Juntos, eles formam o ponteiro Z.

Na montagem, a leitura de um byte no endereço 0x1234 ficaria assim:

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

A família AVR possui 3 pares de registros que podem ser usados ​​para isso. Eles são projetados especificamente em hardware para permitir essas operações.

Ao programar em uma linguagem de nível superior como C, o compilador lida com essas coisas.


Nota: Alguns AVRs até suportam tamanhos de memória maiores que 64k. Esses controladores possuem um registro de função especial no qual bits adicionais do endereço são gravados antes do acesso. O endereço, portanto, consiste nos seguintes bits (MSB para LSB):

Registro de função especial (geralmente 1 byte), ZH (8 bits), ZL (8 bits).

GNA
fonte
1

Os AVRs de 8 bits da Atmel usam realmente um endereço de dados de 16 bits. Existem vários outros registradores de 16 bits e até alguns temporizadores de 16 bits. Como é apenas um processador de 8 bits, geralmente usa dois ciclos de clock para carregar um registro de 16 bits.

Garrett Fogerlie
fonte
1

A Wikipedia explica muito bem:

As CPUs de oito bits usam um barramento de dados de 8 bits e, portanto, podem acessar 8 bits de dados em uma única instrução da máquina. O barramento de endereço normalmente possui um octeto duplo de largura (ou seja, 16 bits), devido a considerações práticas e econômicas. Isso implica em um espaço de endereço direto de apenas 64 KB na maioria dos processadores de 8 bits.

Kamil
fonte
1

A noção de que a "largura de bit" de um processador estabelece a quantidade máxima de RAM que o processador pode tratar é um dos mitos mais difundidos na computação. De fato, a história do setor está repleta de CPUs para as quais esse relacionamento não se manteve.

HP 21MX, HP 1000: CPU de 16 bits, memória até 16 MB

PDP-11: CPU de 16 bits, memória para 4 MB

VAX-11/780: CPU de 32 bits, memória para 512 MB

etc etc.

Jamie Hanrahan
fonte