Comment le processeur 8 bits peut-il prendre en charge plus de 256 octets de RAM?

14

Si un processeur 32 bits peut gérer environ 4 Gio de RAM (soit 232=4294967296 ) octets, pourquoi mon Arduino Mega 2560 possède-t-il 8 Ko de SRAM, si être un processeur 8 bits lui permet de gérer 256 bits seulement octets ( 28 )? Ou est-ce que je lis mal la page suivante?

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

ZaqueoAlejandro
la source
5
Certes, n'importe quelle machine complète est capable d'adresser presque n'importe quelle taille de vérin, avec suffisamment de temps.
John U
2
En fait, le nombre de bits dans un nom de processeur ne peut être utilisé que pour une estimation initiale de la largeur des données internes. Le 8088 est un processeur 16 bits en raison de ses registres 16 bits, mais possède un bus de données 8 bits et un bus d'adresse 20 bits. Le 68000 est un processeur 32 bits principalement appelé 16/32 bits en raison de ses registres 32 bits, mais possède un bus de données 16 bits et un bus d'adresses 24 bits. Les petites implémentations ARM sont des processeurs 32 bits (registres 32 bits et bus de données), mais même s'ils utilisent 32 bits pour les adresses, ils ne peuvent pas adresser un total de 4 Go.
the busybee
J'ai ajouté les préfixes SI corrects pour ces unités. est gibi (Gi) et 2 10 est kibi (Ki). 2302dix
Elliot Alderson
Il convient de mentionner que de nombreux 8 bitters (en particulier les dérivés de Motorola) prennent en charge une soi-disant page zéro , qui était un support de jeu d'instructions pour gérer les 256 premiers octets adressables de la carte mémoire un peu plus rapidement. Ainsi, les registres matériels les plus critiques, etc., seraient mappés dans les 256 premiers octets pour cette raison de performances. C'est la raison pour laquelle vous trouverez des registres matériels mappés à partir de l'adresse zéro sur de nombreuses architectures.
Lundin
appeler quelque chose un 8 bits, 16 bits, 32 bits, etc. est un mot marketing, les ingénieurs l'utilisent mais comprennent que cela ne signifie pas que tout dans ce processeur est aussi large. certaines personnes utilisent la taille de l'instruction, très souvent la taille des registres à usage général est utilisée, parfois le bus. vous avez le compteur de programmes qui n'est pas toujours accessible ou utilisable dans les instructions afin qu'il puisse être aussi large qu'ils le souhaitent. comme pour la plupart des processeurs de type AVR, il existe un schéma à registres multiples ou de pagination ou les deux pour obtenir une adresse de chargement / stockage plus large pour les transactions de données.
old_timer

Réponses:

19

La plupart des processeurs 8 bits ont des bus d'adresse 16 bits leur permettant d'adresser 64 Ko, précisément parce que 256 octets ne suffisent vraiment pas à faire beaucoup! Cela signifie simplement qu'ils doivent charger deux octets au lieu d'un, chaque fois qu'ils ont besoin de charger une adresse. Légèrement plus lent mais tolérable compte tenu de leur taille.

(Et oui, il existe de nombreuses exceptions, principalement développées lorsque 64k est devenu trop petit, mais nous parlons de l'idée de base ici).

Brian Drummond
la source
En fait, la plupart des microcontrôleurs 8 bits que j'ai rencontrés n'ont pas d'adresse 16 bits
phuclv
@Brian Drummond Suis-je correct: le contrôleur écrira d'abord les 8 bits inférieurs puis les 8 bits supérieurs, puis verrouillera le bus d'adresse. C'est ainsi qu'il accédera au bus d'adresse 16 bits!
Swanand
Ou 8 bits supérieurs puis 8 bits inférieurs, mais en gros oui, c'est l'idée.
Brian Drummond
7

Le bus d'adresse et le bus de données sont séparés de sorte qu'ils peuvent avoir des tailles différentes. Pour toutes les tailles de bus d'adresses spécifiques, il existe de nombreuses techniques pour adresser plus de mémoire que la largeur de bits du registre

  • La manière la plus courante consiste à augmenter la largeur du bus d'adresse

    • en utilisant plusieurs registres pour l'adresse

      • AVR a R26..R31 qui peut être couplé en 16 bits X, Yet des Zdonnées d' adressage des registres pour permettre un maximum de 64 Ko de RAM. Ceux à son tour , peut être jumelé avec RAMPX, RAMPY, RAMPZpour accéder à des adresses de RAM plus dans les versions encore plus grandes. Il a également SPHpour les octets élevés du pointeur de pile en plus des SPLvariantes avec plus de 256 octets de RAM 1
      • Intel 8080 et Zilog Z80 sont des processeurs 8 bits, mais ils ont des paires de registres comme H& L, B& C, D& Equi peuvent être utilisées ensemble comme registre d'adresse 16 bits
    • en utilisant un seul grand registre spécial plus grand que la taille naturelle pour l'adressage

      • Intel 8051 est un microcontrôleur 8 bits, c'est-à-dire qu'il a une adresse de données 8 bits. Cependant, il utilise une adresse d'instruction 16 bits et dispose de 2 registres 16 bits: PC et DPTR pour l'adressage dans l'espace d'instructions.
      • AVR a un registre PC 16 ou 22 bits
    • en utilisant un registre spécial pour la partie haute de l'adresse . Lors de l'adressage d'une certaine mémoire, par défaut, les 8 bits bas de l'adresse seront extraits du registre 8 bits immédiat ou 8 bits d'un microcontrôleur 8 bits, tandis que les bits hauts seront remplacés par la valeur de l'autre registre d'adresses.

      • Un cas particulier de ceci est la mémoire segmentée , qui est utilisée par le x86 16 bits . Dans cette technique, la mémoire est divisée en plusieurs segments de taille 64 Ko (2 16 octets). L'accès normal se trouve à l'intérieur d'un seul segment par défaut afin qu'ils puissent utiliser une adresse 16 bits pour des données proches . Les données plus éloignées doivent être adressées spécifiquement par la valeur du segment, par conséquent 2 registres doivent être utilisés pour un adressage éloigné.
      • Le microcontrôleur PIC , dont les séries de base et de milieu de gamme peuvent avoir une adresse de 13 ou 14 bits, en est un autre exemple. Lors de l'utilisation callou de l' gotoinstruction, 8 ou 9 bits bas de l'adresse sont indiqués par l'immédiat et le reste est extrait du compteur de programme actuel. Ainsi, accéder à tout ce qui n'est pas loin dans le segment actuel utilise seulement 1 instruction, tandis que les adresses supplémentaires auront besoin de 2 instructions (pour définir les bits hauts).
      • Un autre exemple est l' architecture MIPS qui combine également l'adresse immédiate inférieure de 26 bits avec les 6 bits supérieurs PCpendant le saut inconditionnel.
  • Un autre moyen d'y parvenir est la banque de mémoire . C'est une méthode utile encore utilisée dans certaines architectures de nos jours. Dans ce modèle, la mémoire est divisée en plusieurs banques . Chaque fois, vous ne pouvez vous adresser qu'à une banque spécifique. Il existe souvent une banque mondiale ou une plage d'adresses qui sont toujours visibles à tout moment, mais pour les autres parties, vous devez changer de banque en cas de besoin.

    • Intel 8051 utilise la banque de mémoire pour les registres. Il a 32 registres mais seulement 8 d'entre eux sont visibles à la fois.
    • PAE x86 et LPAE ARM , avec un plus grand espace d'adressage physique mappé à un petit espace d'adressage virtuel
    • Une autre application pour cela est les extensions de fenêtrage d'adresses sur Windows qui peuvent être utilisées par des applications x86 32 bits en mode PAE afin d'accéder à plus de 2/3 Go de mémoire. Ce n'est pas exactement comme une banque de mémoire sur les microcontrôleurs, mais peut être vu comme tel, car la grande plage d'adresses peut être considérée comme de petites fenêtres / banques suffisamment petites pour tenir dans l'espace d'adressage de l'application. Si l'application doit utiliser des données dans une fenêtre, elle mappera cette fenêtre dans son espace d'adressage actuel.
    • DOS a également certains types de commutation de banque comme la mémoire étendue ou la mémoire étendue en raison de sa plage limitée de mémoire adressable.
  • Il existe également une technique pas tout à fait commune, mais on peut la trouver dans l' Intel 8051 . En tant que microcontrôleur avec une adresse de données 8 bits, il peut avoir au maximum 256 adresses. La moitié de l'espace (la partie haute) est utilisée pour les registres de fonctions spéciales ( SFR ), limitant la RAM réelle adressable à seulement 128 octets. Cependant, les fabricants modernes de la série 8051 ont trouvé un moyen intelligent de surmonter cela en séparant l'accès à la mémoire . L'adressage direct accède au SFR tandis que l' adressage indirect, bien que les registres accèdent à la partie haute de la RAM, ce qui signifie que vous avez maintenant 256 + 128 = 384 octets adressables.


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

Les plus petits cœurs ont ≤256 octets d'espace d'adressage de données (ce qui signifie ≤128 octets de RAM après la suppression des ports d'E / S et autres adresses réservées) et ≤8192 octets (8 Ko) de ROM de programme. Ceux-ci n'ont qu'un pointeur de pile 8 bits (en SPL) et ne prennent en charge que les instructions de saut / appel relatives 12 bits RJMP / RCALL. (Parce que le compteur de programme AVR compte des mots de 16 bits, et non des octets, un décalage de 12 bits est suffisant pour adresser 213 octets de ROM.)

Des capacités d'adressage de mémoire supplémentaires sont présentes au besoin pour accéder aux ressources disponibles:

  1. Les modèles avec> 256 octets d'espace d'adressage de données (≥256 octets de RAM) ont un pointeur de pile de 16 bits, avec la moitié haute dans le registre SPH.
  2. Les modèles avec> 8 Ko de ROM ajoutent les instructions JUMP et CALL à 2 mots (22 bits). (Certains premiers modèles souffrent d'un erratum si une instruction de saut est suivie d'une instruction de 2 mots.)
  3. Les modèles avec> 64 Ko de ROM ajoutent l'instruction ELPM et le registre RAMPZ correspondant. Les instructions LPM étendent à zéro l'adresse ROM en Z; Les instructions ELPM ajoutent le registre RAMPZ aux bits hauts. Ce n'est pas la même chose que l'instruction LPM plus générale; il existe des modèles "classiques" avec seulement la forme zéro-opérande d'ELPM (ATmega103 et at43usb320). Lorsque l'incrémentation automatique est disponible (la plupart des modèles), elle met à jour l'adresse 24 bits complète, y compris RAMPZ.
  4. Les modèles (rares) avec> 128 Ko de ROM ont un compteur de programme de 3 octets. Les appels et les retours de sous-programmes utilisent un octet supplémentaire d'espace de pile, il y a un nouveau registre EIND pour fournir des bits hauts supplémentaires pour les sauts et les appels indireect, et il y a de nouvelles instructions étendues EIJMP et EICALL qui utilisent EIND: Z comme adresse de destination. (Les instructions IJMP et ICALL précédentes utilisent Z étendu zéro.)
  5. Les modèles (rares) avec> 64 Ko d'espace d'adressage RAM étendent les limites d'adressage RAM 16 bits avec les registres RAMPX, RAMPY, RAMPZ et RAMPD. Ceux-ci fournissent des bits hauts supplémentaires pour les modes d'adressage qui utilisent respectivement les paires de registres X, Y ou Z ou les instructions d'adressage direct LDS / STS. Contrairement à l'accès ROM, il n'y a pas d'instructions distinctes "étendues"; au lieu de cela, les registres RAMP sont utilisés sans condition.
phuclv
la source
6

Presque tous les processeurs 8 bits ont une certaine capacité à former une adresse 16 bits à partir d'une partie d'ordre faible et d'une partie d'ordre élevé. Sur certains processeurs, y compris le 8080 d'origine, il existe des registres dédiés à la conservation des parties supérieure et inférieure d'une adresse (bien que du point de vue du programmeur, il puisse y avoir certains registres comme le pointeur de pile du 8080 qui n'offrent pas d'instructions pour les traiter séparément). Dans certains autres processeurs, il n'y a pas de registres dédiés à la moitié supérieure ou inférieure d'une adresse, mais les adresses sont assemblées "à la volée". Par exemple, sur le 6502, l'instruction "LDA $ 1234, X" charge l'accumulateur avec l'adresse formée en ajoutant $ 1234 au registre X 8 bits [supposons qu'il contienne $ F0]. L'exécution de cette instruction se déroulerait en 4 ou 5 étapes:

  1. Terminer l'écriture du registre à partir des instructions précédentes (le cas échéant) et charger l'opcode ($ BD)
  2. Récupère le premier octet d'opérande suivant l'opcode ($ 34) lors de l'instruction de décodage
  3. Récupérer le deuxième octet d'opérande (12 $) tout en ajoutant l'octet récupéré précédemment au registre X
  4. Lire la mémoire à l'adresse formée en concaténant le deuxième octet d'opérande au résultat ALU [c'est-à-dire $ 1224]. Alimentez le deuxième octet d'opérande dans ALU pour ajouter zéro ou un selon que l'ajout précédent a généré un report
  5. Lire la mémoire à l'adresse formée en remplaçant la moitié supérieure par un résultat ALU [1334 $]

Le transfert de l'octet de lecture vers l'accumulateur chevauchera la récupération de l'instruction suivante. De plus, pour de nombreuses opérations, si l'étape 3 n'a pas généré de report, l'étape 4 aurait lu l'adresse correcte et l'exécution pourrait passer directement de l'étape 4 à l'instruction suivante, en contournant l'étape 5.

Si l'on examine la séquence des opérations, on remarquera qu'une architecture little-endian a un avantage certain sur une grande-endian, dans la mesure où dans la plupart des cas (bien que ce ne soit pas celui illustré), même si l'ALU prend un cycle pour effectuer De plus, il est possible de lire un octet à partir de l'adresse calculée sans attendre le résultat ALU, car normalement l'octet haut qui a été récupéré sera l'octet haut de l'opérande cible. Sur une machine big-endian avec une ALU 8 bits, une charge indexée prendrait au moins 5 cycles (puisque la moitié inférieure de l'adresse ne serait pas lue avant l'étape 3, et serait donc calculée à l'étape 4).

supercat
la source
Je me souviens avoir vu des publicités pour des ordinateurs avec des processeurs 8 bits et 1 mégaoctet de mémoire. Cela a été fait en utilisant deux registres 8 bits sur le CPU plus un registre 8 bits pas sur le CPU pour former l'adresse entière.
user6030
@ user6030: Il existe de nombreuses façons d'accomplir de telles choses. Généralement, certaines parties de l'espace d'adressage seront "fixes" et d'autres seront sélectionnables par la banque. Certains appareils fonctionnent bien pour les programmeurs; beaucoup d'autres, pas tant.
supercat
6

Les lignes de bus de données (broches) et les lignes d'adresse (broches) sont complètement séparées. En termes simples, les lignes de bus de données déterminent le nombre maximum de bits qui peuvent être transférés un à la fois (et stockés dans la mémoire) tandis que les lignes d'adresse déterminent le nombre maximum de "cellules" de mémoire qui peuvent être sélectionnées.

C'était principalement une chose marketing que les processeurs x86 32 bits ne pouvaient pas gérer plus de 4 Go de RAM. Je me souviens quelque part qu'il y avait des broches A33-34 sur les processeurs Pentium 4.

dprogrammer
la source
1
Vous avez raison - PAE a permis d'utiliser plus de RAM, mais comme il n'était pas disponible sur Windows, peu de gens l'ont utilisé.
pjc50
264
Les processeurs x86 ne peuvent pas traiter plus de 4 Go sans complications importantes dans le système d'exploitation qui ne sont pas portées vers d'autres architectures.
Kaz
1
@Kaz ARM 32 bits a une fonctionnalité similaire appelée LPAE, qui permet au système d'exploitation d'adresser plus de 32 bits d'adresse
phuclv
3

Il est souvent vrai qu'il existe une relation entre la taille de la mémoire adressable et la taille du registre interne, bien que la relation varie pour différentes raisons. 256 octets d'espace d'adressage étaient considérés comme trop petits, même au tout début des microprocesseurs, de sorte que la plupart des processeurs à huit bits produisaient des adresses à 16 bits (deux octets), qui adressaient 64 kilo-octets. Cependant, avec le changement de banque (essentiellement en utilisant certaines lignes d'E / S pour produire encore plus de lignes d'adresse), il était possible d'en avoir beaucoup plus.

Dans les premiers processeurs 16 et 32 ​​bits, il n'y avait pas toujours assez de broches sur le périphérique pour atteindre tout l'espace que leurs registres d'adresses internes pouvaient traiter. Par exemple, sur le Motorola 68000, il n'y avait que suffisamment de broches d'adresse (24) pour adresser 16 mégaoctets de RAM, bien que les registres d'adresses internes aient une largeur de 32 bits.

Gus Mueller
la source
2

Je répondrai à cette question spécifiquement pour les contrôleurs AVR que vous avez mentionnés. Le principe de base est également valable pour de nombreuses autres architectures 8 bits.

Les AVR sont des cœurs 8 bits. Cela signifie qu'ils ont des registres 8 bits. Cependant, 8 bits ne suffisent pas pour accéder à une quantité de mémoire utilisable. Par conséquent, le noyau AVR est capable d'utiliser un ensemble spécifique de registres combinés en tant que registres de pointeurs 16 bits. Les registres r30 et r31 (également alias ZL et ZH) en sont un exemple. Ensemble, ils forment le pointeur Z.

Dans l'assembly, la lecture d'un octet à l'adresse 0x1234 ressemblerait à ceci:

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 famille AVR dispose de 3 paires de registres qui peuvent être utilisées à cet effet. Ils sont spécifiquement conçus en matériel pour permettre de telles opérations.

Lors de la programmation dans un langage de niveau supérieur comme C, le compilateur gère ce genre de choses.


Remarque: Certains AVR prennent même en charge des tailles de mémoire supérieures à 64 Ko. Ces contrôleurs ont un registre de fonctions spéciales dans lequel des bits supplémentaires de l'adresse sont écrits avant l'accès. L'adresse est donc constituée des bits suivants (MSB à LSB):

Registre de fonctions spéciales (généralement 1 octet), ZH (8 bits), ZL (8 bits).

GNA
la source
1

Les AVR 8 bits d'Atmel utilisent en fait une adresse de données 16 bits. Ils ont de nombreux autres registres 16 bits et même quelques temporisateurs 16 bits. Comme il ne s'agit que d'un processeur 8 bits, il utilise généralement deux cycles d'horloge pour charger un registre 16 bits.

Garrett Fogerlie
la source
1

Wikipédia explique assez bien:

Les CPU à huit bits utilisent un bus de données à 8 bits et peuvent donc accéder à 8 bits de données dans une seule instruction machine. Le bus d'adresse a généralement une largeur de deux octets (c'est-à-dire 16 bits), en raison de considérations pratiques et économiques. Cela implique un espace d'adressage direct de seulement 64 Ko sur la plupart des processeurs 8 bits.

Kamil
la source
1

La notion selon laquelle la "largeur de bit" d'un processeur établit la quantité maximale de RAM que le processeur peut traiter est l'un des mythes les plus répandus en informatique. En fait, l'histoire de l'industrie est jonchée de processeurs pour lesquels cette relation ne tenait pas.

HP 21MX, HP 1000: CPU 16 bits, mémoire jusqu'à 16 Mo

PDP-11: CPU 16 bits, mémoire jusqu'à 4 Mo

VAX-11/780: CPU 32 bits, mémoire jusqu'à 512 Mo

etc.

Jamie Hanrahan
la source