Как может 8-битный процессор поддерживать более 256 байтов оперативной памяти?


14

Если 32- битный процессор может обрабатывать примерно 4 ГБ ОЗУ (то есть 232=4294967296 ) байтов, почему мой Arduino Mega 2560 имеет 8 КБ SRAM, если 8- битный процессор позволяет обрабатывать только 256 байт ( 28 )? Или я неправильно читаю следующую страницу?

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


5
Несомненно, любая машина, полная по Тьюрингу, способна справиться практически с любым размером плунжера, если отведено достаточно времени.
Джон U,

2
На самом деле количество бит в имени процессора может использоваться только для предварительной оценки внутренней ширины данных. 8088 - 16-битный процессор из-за его 16-битных регистров, но имеет 8-битную шину данных и 20-битную адресную шину. 68000 - это 32-разрядный процессор, который в основном называется 16/32-разрядным из-за его 32-разрядных регистров, но имеет 16-разрядную шину данных и 24-разрядную адресную шину. Малые реализации ARM представляют собой 32-разрядные процессоры (32-разрядные регистры и шина данных), но даже если они используют 32-разрядные адреса, они не могут адресовать всего 4 ГБ.
занятая пчела

Я добавил правильные префиксы SI для этих юнитов. - это киби (Gi), а 2 10 - это киби (Ki). 230210
Эллиот Олдерсон

Стоит отметить, что многие 8 битеров (особенно производные Motorola) поддерживают так называемую нулевую страницу , которая была поддержкой набора команд для обработки первых 256 адресуемых байтов на карте памяти немного быстрее. Таким образом, наиболее критичные по времени аппаратные регистры и т. Д. Будут отображаться в первые 256 байтов по этой причине производительности. Это причина, по которой вы найдете аппаратные регистры, сопоставленные с нулевого адреса на многих архитектурах.
Лундин

Называя что-то 8-битным, 16-битным, 32-битным и т. д., скажем, маркетинговым термином, инженеры используют его, но понимают, что это не означает, что все в этом процессоре настолько широко. некоторые люди используют размер инструкции, очень часто используется размер регистров общего назначения, иногда шины. у вас есть программный счетчик, который не всегда доступен или пригоден для использования в инструкциях, поэтому он может быть настолько широким, насколько им нужно. затем, как и во многих процессорах типа AVR, существует схема с несколькими регистрами или пейджингом, или обе, чтобы получить более широкий адрес загрузки / сохранения для транзакций данных.
old_timer

Ответы:


19

Большинство 8-битных процессоров имеют 16-битные адресные шины, позволяющие им адресовать 64 КБ, именно потому, что 256 байтов действительно недостаточно, чтобы сделать очень много! Это просто означает, что им нужно загружать два байта вместо одного, каждый раз, когда им нужно загрузить адрес. Немного медленнее, но терпимо, учитывая их размер.

(И да, есть много исключений, в основном, разработанных, когда 64k стали слишком маленькими, но здесь мы говорим об основной идее).


На самом деле большинство из 8-битных микроконтроллеров, с которыми я сталкивался, не имеют 16-битного адреса
phuclv

@ Брайан Драммонд Правильно ли: контроллер сначала запишет младшие 8 бит, затем старшие 8 бит, а затем зафиксирует адресную шину. Вот так он получит доступ к 16-битной адресной шине!
Суонанд

Or upper 8 bits then lower 8 bits, but basically yes, that's the idea.
Brian Drummond

7

The address bus and data bus are separated so they may have different sizes. For any specific address bus sizes there are a lot of techniques to address more memory than the register bit width

  • The most common way is increasing the address bus width somehow by

    • using multiple registers for the address

      • AVR имеет R26..R31, который может быть спарен с 16-битным X, Yи Zрегистры адресации данных позволяют максимально использовать 64 КБ ОЗУ. Те , в свою очередь , могут быть соединены с RAMPX, RAMPY, RAMPZчтобы получить доступ к более высоким адресам ОЗУ в еще большие версии. Он также имеет SPHстаршие байты указателя стека в дополнение к SPLвариантам с более чем 256 байтами ОЗУ 1
      • Intel 8080 и Zilog Z80 - это 8-битные процессоры, но у них есть пары регистров, такие как H& L, B& C, D&, Eкоторые можно использовать вместе как 16-битный адресный регистр
    • используя один большой специальный регистр больше натурального размера для адресации

      • Intel 8051 is an 8-bit microcontroller, i.e. it has 8-bit data address. However it uses 16-bit instruction address and has 2 16-bit registers: PC and DPTR for addressing in instruction space.
      • AVR имеет 16 или 22-битный регистр ПК
    • using a special register for the high part of the address. When addressing some memory, by default the 8 low bits of the address will be taken from the 8-bit immediate or 8-bit register on an 8-bit microcontroller, whereas the high bits will be replaced by the other address register's value.

      • A special case of this is segmented memory, which is used by the 16-bit x86. In this technique the memory is divided into multiple segments of size 64KB (216 bytes). Normal access is inside a single segment by default so they can use 16-bit address for near data. Data that are further apart must be addressed specifically by segment value, therefore 2 registers must be used for far addressing.
      • ПИК микроконтроллер , чей базовая линия и серия середины диапазона может иметь 13 или 14-битный адрес, является еще одним примером. При использовании callили gotoинструкции 8 или 9 младших битов адреса указываются непосредственными, а оставшиеся берутся из текущего программного счетчика. Таким образом, для доступа ко всему, что находится рядом с текущим сегментом, используется только 1 инструкция, в то время как для дальнейших адресов потребуется 2 инструкции (для установки старших битов).
      • Другим примером является архитектура MIPS, которая также сочетает младший 26-битный непосредственный адрес с старшими 6 битами PCпри безусловном переходе.
  • Еще один способ добиться этого - банкинг памяти . Это полезный метод, который до сих пор используется в некоторых архитектурах. В этой модели память делится на несколько банков . Каждый раз вы можете обратиться только в конкретный банк. Часто существует глобальный банк или диапазон адресов, которые всегда видны в любое время, но для других частей вы должны поменять банк при необходимости.

    • Intel 8051 использует банки памяти для регистров. Он имеет 32 регистра, но только 8 из них видны одновременно.
    • x86 PAE и ARM LPAE , с большим физическим адресным пространством, сопоставленным с небольшим виртуальным адресным пространством
    • Another application for this is the Address Windowing Extensions on Windows which can be used by 32-bit x86 apps in PAE mode in order to access more than 2/3GB of memory. It's not exactly like a memory bank on microcontrollers but can be seen as such, because the big address range can be think of small windows/banks that is small enough to fit in the app's address space. If the app needs to use data in some window it will map that window into its current address space.
    • DOS also has some types of bank switching like expanded memory or extended memory due to its limited range of addressable memory.
  • Существует также не совсем распространенная техника, но ее можно найти в Intel 8051 . Как микроконтроллер с 8-битным адресом данных, он может иметь не более 256 адресов. Половина пространства (верхняя часть) используется для регистров специальных функций ( SFR ), ограничивая реальную ОЗУ адресуемой только 128 байтами. Однако современные производители серии 8051 нашли умный способ преодолеть это, разделив доступ к памяти . Прямая адресация будет обращаться к SFR, а косвенная - к регистрам, которые будут обращаться к большей части ОЗУ, что означает, что теперь у вас есть 256 + 128 = 384 адресуемых байта.


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

Самые маленькие ядра имеют ≤256 байтов адресного пространства данных (то есть ≤128 байтов ОЗУ после удаления портов ввода-вывода и других зарезервированных адресов) и ≤8192 байта (8 КиБ) программного ПЗУ. Они имеют только 8-битный указатель стека (в SPL) и поддерживают только 12-битные относительные инструкции перехода / вызова RJMP / RCALL. (Поскольку счетчик программы AVR считает 16-битные слова, а не байты, 12-битное смещение достаточно для адресации 213 байт ПЗУ.)

Дополнительные возможности адресации памяти предоставляются по мере необходимости для доступа к доступным ресурсам:

  1. Модели с> 256 байтами адресного пространства данных (≥256 байтов ОЗУ) имеют 16-битный указатель стека с верхней половиной в регистре SPH.
  2. Модели с ПЗУ> 8 КБ добавляют 2-х (22-битные) инструкции JUMP и CALL. (Некоторые ранние модели страдают ошибками, если за инструкцией пропуска следует инструкция из 2 слов.)
  3. Модели с ПЗУ> 64 КиБ добавляют инструкцию ELPM и соответствующий регистр RAMPZ. Инструкции LPM расширяют адрес ПЗУ до нуля; Инструкции ELPM предшествуют регистру RAMPZ для старших битов. Это не то же самое, что более общая инструкция LPM; существуют «классические» модели только с формой ELPM с нулевым операндом (ATmega103 и at43usb320). Когда доступно автоинкремент (большинство моделей), он обновляет весь 24-битный адрес, включая RAMPZ.
  4. (Редкие) модели с ПЗУ> 128 КиБ имеют трехбайтовый программный счетчик. Для вызова и возврата подпрограммы используется дополнительный байт стекового пространства, имеется новый регистр EIND для предоставления дополнительных старших битов для косвенных переходов и вызовов, а также есть новые расширенные инструкции EIJMP и EICALL, которые используют EIND: Z в качестве адреса назначения. (В предыдущих инструкциях IJMP и ICALL Z был расширен до нуля.)
  5. (Редкие) модели с адресным пространством ОЗУ> 64 КиБ расширяют пределы адресации 16-битной ОЗУ с помощью регистров RAMPX, RAMPY, RAMPZ и RAMPD. Они обеспечивают дополнительные старшие биты для режимов адресации, которые используют пары регистров X, Y или Z соответственно или инструкции прямой адресации LDS / STS. В отличие от доступа к ПЗУ, нет четких «расширенных» инструкций; вместо этого регистры RAMP используются безоговорочно.

6

Почти все 8-битные процессоры имеют некоторую способность формировать 16-битный адрес из младшей и старшей частей. На некоторых процессорах, включая оригинальный 8080, существуют регистры, предназначенные для хранения верхней и нижней части адреса (хотя с точки зрения программиста могут существовать некоторые регистры, такие как указатель стека 8080, которые не предлагают инструкции для их адресации отдельно). В некоторых других процессорах нет регистров, предназначенных для верхней или нижней половины адреса, но адреса собираются «на лету». Например, на 6502 инструкция «LDA $ 1234, X» загружает аккумулятор с адресом, образованным путем добавления $ 1234 в 8-битный регистр X [предположим, что он содержит $ F0]. Выполнение этой инструкции будет проходить в 4 или 5 шагов:

  1. Завершите запись в регистр из предыдущей инструкции (если есть) и загрузите код операции ($ BD)
  2. Получить первый байт операнда после кода операции ($ 34) во время инструкции по декодированию
  3. Получить второй байт операнда ($ 12) при добавлении ранее извлеченного байта в регистр X
  4. Считайте память по адресу, сформированному путем объединения второго байта операнда с результатом ALU [т.е. $ 1224]. Введите второй байт операнда в ALU, чтобы добавить ноль или единицу в зависимости от того, сгенерировал ли предыдущее добавление перенос
  5. Чтение памяти по адресу, сформированному путем замены верхней половины на результат ALU [$ 1334]

Передача считанного байта в аккумулятор будет перекрывать выборку следующей инструкции. Кроме того, для многих операций, если шаг 3 не сгенерировал перенос, шаг 4 считал бы правильный адрес, и выполнение могло бы перейти непосредственно от шага 4 к следующей инструкции, минуя шаг 5.

Если вы изучите последовательность операций, то заметите, что архитектура с прямым порядком байтов имеет определенное преимущество над архитектурой с прямым порядком байтов, в этом случае в большинстве случаев (хотя и не той, что показана), даже если ALU выполняет цикл для выполнения Кроме того, можно считывать байт с вычисленного адреса, не ожидая результата ALU, поскольку обычно выбираемый старший байт будет старшим байтом целевого операнда. На машине с прямым порядком байтов с 8-битным ALU индексированная загрузка будет занимать не менее 5 циклов (поскольку нижняя половина адреса не будет считана до шага 3 и, следовательно, будет вычислена на шаге 4).


I remember seeing some ads for computers with 8-bit processors and 1 megabyte of memory. This was done by using two 8-bit registers on the CPU plus one 8-bit register not on the CPU to form the entire address.
user6030

@user6030: There are many ways of accomplishing such things. Typically parts of the address space will be "fixed" and others will be bank-selectable. Some devices work out nicely for programmers; many others, not so much.
supercat

6

Databus lines (pins) and address lines (pins) are completely separate. Simply put, databus lines determine maximum number of bits that can be transferred one at a time (and stored on the memory) whereas address lines determine maximum number of memory "cells" that can be selected.

It was mostly a marketing thing that 32-bit x86 CPUs couldn't address more than 4GB of RAM. I remember somewhere that there were A33-34 pins on Pentium 4 CPUs.


1
You are correct - PAE allowed the use of more RAM, but as it wasn't available on desktop Windows not many people ever used it.
pjc50

PAE is the name of the feature. Also, 64-bit processors can't address 64 exabytes, as 264 would suggest.
Phil Frost

x86 CPU's cannot address more than 4GB without significant complications in the operating system which do not port to other architectures.
Kaz

1
@Kaz ARM 32-bit has a similar feature called LPAE, which allows the operating system to address more than 32 bits of address
phuclv

3

It's often true that there is some relationship between addressable memory size and internal register size, though the relationship varies for different reasons. 256 bytes of address space was considered too small even in the very early days of microprocessors, so most eight bit processors produced 16 bit (two byte) addresses, which addressed 64 kilobytes. With bank switching, though (essentially using certain I/O lines to produce even more address lines), it was possible to have much more.

In the first 16 and 32 bit processors, there weren't always enough pins on the device to reach all the space that their internal address registers could address. For example, on the Motorola 68000, there were only enough address pins (24) to address 16 megabytes of RAM, though the internal address registers were 32 bits wide.


2

I will answer this question specifically for the AVR controllers you mentioned. The basic principle also holds true for many other 8-bit architectures.

AVRs are 8-bit cores. This means they have 8-bit Registers. However, 8 bits are not enough to access a usable amount of memory. Therefore, the AVR core is able to use a specific set of registers combined as 16 bit pointer registers. The registers r30 and r31 (also aliased as ZL and ZH) are an example for this. Together they form the Z Pointer.

In assembly reading a byte at address 0x1234 would looks like this:

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

The AVR family has 3 register pairs that can be used for this. They are specifically designed in hardware to allow such operations.

When programming in a higher level language like C, the compiler handles this stuff.


Note: Some AVRs even support bigger memory sizes than 64k. These controllers have a special function register in which additional bits of the address are written before the access. The address therefore consists of following bits (MSB to LSB):

Special function register (usually 1 byte), ZH (8bit), ZL (8bit).


1

Atmel's 8 bit AVR's actually use a 16 bit data address. The have numerous other 16 bit registers and even some 16 bit timers. Since it is only an 8 bit processor, it usually uses two clock cycles to load a 16 bit register.


1

Wikipedia explains it pretty well:

Eight-bit CPUs use an 8-bit data bus and can therefore access 8 bits of data in a single machine instruction. The address bus is typically a double octet wide (i.e. 16-bit), due to practical and economical considerations. This implies a direct address space of only 64 KB on most 8-bit processors.


1

The notion that the "bit width" of a processor establishes the maximum amount of RAM the processor can address is one of the most pervasive myths in computing. In fact the industry history is just littered with CPUs for which this relationship did not hold.

HP 21MX, HP 1000: 16-bit CPU, memory to 16 MB

PDP-11: 16-bit CPU, memory to 4 MB

VAX-11/780: 32-bit CPU, memory to 512 MB

etc., etc.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.