Як 8-бітний процесор може підтримувати більше 256 байт оперативної пам’яті?


14

Якщо 32- бітний процесор може обробляти приблизно 4 ГБ оперативної пам’яті (тобто ) байтів, чому мій Arduino Mega 2560 має 8 KiB SRAM, якщо 8- бітний процесор дозволяє йому обробляти всього 256 байт ( )? Або я читаю наступну сторінку неправильно?232=42949672962 828

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


5
Безумовно, будь-яка машина, яка працює на цірі, здатна вирішувати практично будь-який розмір оперативної пам'яті за достатньо часу.
Джон У

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

Я додав правильні префікси SI для цих одиниць. - гібі (Gi), а - кібі (Ki). 2 10230210
Елліот Олдерсон

Варто зазначити, що багато 8 біт (особливо похідних Motorola) підтримують так звану нульову сторінку , яка була підтримкою набору інструкцій для обробки перших 256 адресних байтів на карті пам'яті трохи швидше. Таким чином, найбільш критичні за часом апаратні регістри тощо будуть відображені в перші 256 байт з цієї причини продуктивності. З цієї причини ви знайдете апаратні регістри, зіставлені з нульової адреси на безлічі архітектур.
Лундін

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

Відповіді:


19

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

(І так, існує багато винятків, які в основному розроблялися, коли 64k стали занадто маленькими, але тут ми говоримо про основну ідею).


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

@ Brian Drummond Чи правильно: Controller запише спочатку нижній 8 біт, потім верхній 8 біт, а потім вив'яже шину адреси. Ось так він отримає доступ до 16-бітної адресної шини!
Swanand

Або верхній 8 біт, потім нижній 8 біт, але в основному так, це ідея.
Брайан Драммонд

7

Адреса шини і шини даних розділені таким чином , вони можуть мати різні розміри. Для будь-яких конкретних розмірів адресної шини існує багато методів для адреси більшої кількості пам'яті, ніж ширина біта регістра

  • Найпоширеніший спосіб - якось збільшити ширину адресної шини

    • використовуючи кілька регістрів для адреси

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

      • Intel 8051 - це 8-бітний мікроконтролер, тобто він має 8-бітну адресу даних. Однак він використовує 16-бітну адресу інструкції та має 2 16-бітні регістри: ПК та DPTR для адреси в просторі інструкцій.
      • AVR має 16 або 22-бітний регістр ПК
    • використовуючи спеціальний реєстр для високої частини адреси . Звертаючись до деякої пам’яті, за замовчуванням 8 низьких бітів адреси будуть взяті з 8-бітового негайного або 8-бітного регістра на 8-бітовому мікроконтролері, тоді як високі біти будуть замінені значенням регістра іншої адреси.

      • Особливим випадком цього є сегментована пам'ять , яка використовується 16-бітним x86 . У цій техніці пам'ять поділяється на кілька сегментів розміром 64 КБ (2 16 байт). Нормальний доступ за замовчуванням знаходиться в одному сегменті, щоб вони могли використовувати 16-бітну адресу для близьких даних . Далі, які знаходяться далі, повинні бути адресовані конкретно за значенням сегмента, тому для далекої адреси потрібно використовувати 2 регістри.
      • ПІК мікроконтролер , чий базова лінія та серія середини діапазону може мати 13 або 14-бітову адресу, є ще одним прикладом. При використанні callабо gotoвказівці 8 або 9 малих бітів адреси вказується негайно, а решта береться з поточного лічильника програми. Таким чином, для доступу до чогось недалеко від поточного сегмента використовується лише 1 інструкція, тоді як для подальших адрес потрібні 2 вказівки (щоб встановити високі біти).
      • Іншим прикладом є архітектура MIPS, яка також поєднує нижню 26-бітну безпосередню адресу з високими 6 бітами, PCколи беззастережно стрибає.
  • Ще один спосіб досягти цього - банкінг пам'яті . Це корисний метод, який досі використовується в деяких архітектурах. У цій моделі пам'ять поділяється на кілька банків . Щоразу можна звертатися лише до певного банку. Часто існує глобальний банк або діапазон адрес, які завжди видно в будь-який час, але для інших частин ви повинні переключити банк, коли це необхідно.

    • Intel 8051 використовує банкір пам'яті для регістрів. Він має 32 регістри, але лише 8 з них видно одночасно.
    • x86 PAE та ARM LPAE , з більшим фізичним адресним простором відображено невеликий віртуальний адресний простір
    • Іншим додатком для цього є розширення розширення адреси для Windows, яке може використовуватися 32-бітними програмами x86 в режимі PAE для доступу до більш ніж 3/3 ГБ пам'яті. Це не зовсім як банк пам'яті на мікроконтролерах, але його можна розглядати як такий, тому що великий діапазон адрес можна думати про невеликі вікна / банки, які є досить маленькими, щоб вміститись у адресному просторі програми. Якщо додатку потрібно використовувати дані в якомусь вікні, воно відобразить це вікно у його поточний адресний простір.
    • DOS також має деякі типи комутації банків, наприклад, розширену пам'ять або розширену пам'ять через обмежений діапазон адреси, що запам'ятовується.
  • Існує також не зовсім поширена методика, але її можна знайти в 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 KiB) програмного ПЗУ. Вони мають лише 8-бітний покажчик стека (у SPL) і підтримують лише 12-бітні інструкції щодо переходу / виклику RJMP / RCALL. (Оскільки лічильник програм AVR налічує 16-бітні слова, а не байти, 12-бітове зміщення достатньо для адреси 213 байт ПЗУ.)

Для доступу до наявних ресурсів наявні додаткові можливості адреси пам'яті:

  1. Моделі з> 256 байтами адресного простору даних (≥256 байт оперативної пам’яті) мають 16-бітний покажчик стека, з високою половиною в регістрі SPH.
  2. Моделі з> 8 KiB ПЗУ додають 2-слові (22-бітні) інструкції JUMP та CALL. (Деякі ранні моделі страждають від помилок, якщо за пропускною інструкцією слідує 2-словечна інструкція.)
  3. Моделі з> 64 KiB ПЗУ додають інструкцію ELPM та відповідний регістр RAMPZ. Інструкції LPM з нульовим розширенням адреси ROM в Z; Інструкції ELPM додають регістр RAMPZ для високих бітів. Це не те саме, що більш загальна інструкція LPM; існують "класичні" моделі з лише нульовою операндною формою ELPM (ATmega103 та at43usb320). Коли функція автоматичного збільшення (більшість моделей) доступна, вона оновлює всю 24-бітну адресу, включаючи RAMPZ.
  4. (Рідкісні) моделі з> 128 КБ ПЗУ мають 3-байтний програмний лічильник. Виклики та повернення підпрограми використовують додатковий байт простору стека, є новий реєстр EIND для надання додаткових високих бітів для непрямих стрибків та викликів, є нові розширені інструкції EIJMP та EICALL, які використовують EIND: Z в якості адреси призначення. (У попередніх інструкціях IJMP та ICALL використовується розширений нуль Z.)
  5. (Рідкісні) моделі з адресним простором> 64 KiB оперативної пам’яті RAM розширюють обмеження адресності 16-бітної оперативної пам’яті за допомогою регістрів RAMPX, RAMPY, RAMPZ та RAMPD. Вони забезпечують додаткові високі біти для адресних режимів, у яких використовуються регістри X, Y або Z відповідно або інструкції прямої адреси LDS / STS. На відміну від доступу до ROM, немає чітких "розширених" інструкцій; натомість регістри 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-бітовою АЛУ індексоване навантаження зайняло б щонайменше 5 циклів (оскільки нижня половина адреси не буде прочитана до кроку 3, і, таким чином, буде обчислена на кроці 4).


Я пам’ятаю, що бачив деякі оголошення для комп’ютерів з 8-бітовими процесорами та 1 мегабайт пам’яті. Це було зроблено за допомогою двох 8-бітових регістрів на процесорі плюс один 8-бітний регістр, не в процесорі для формування всієї адреси.
user6030

@ user6030: Є багато способів досягнення таких речей. Зазвичай частини адресного простору будуть "виправлені", а інші - вибирати банк. Деякі пристрої добре працюють для програмістів; багато інших, не так вже й багато.
supercat

6

Лінії шини даних (шпильки) та рядки адреси (шпильки) абсолютно окремі. Простіше кажучи, рядки шини даних визначають максимальну кількість бітів, які можна передавати по одному (і зберігати в пам'яті), тоді як адреси адрес визначають максимальну кількість "комірок" пам'яті, які можна вибрати.

Це здебільшого маркетингова річ, що 32-розрядні процесори x86 не могли зайняти більше 4 Гб оперативної пам'яті. Я десь пам’ятаю, що на процесорах Pentium 4 були штифти A33-34.


1
Ви маєте рацію - PAE дозволило використовувати більше оперативної пам’яті, але оскільки вона не була доступна на робочих столах Windows, не багато людей її ніколи не використовували.
pjc50

264

Процесор x86 не може вирішити більше 4 Гб без значних ускладнень в операційній системі, які не портують до інших архітектур.
Каз

1
32-розрядний @Kaz ARM має подібну функцію під назвою LPAE, яка дозволяє операційній системі адресувати більше 32 біт адреси
phuclv

3

Часто буває вірно, що існує певний взаємозв'язок між розміром адресної пам'яті та розміром внутрішнього реєстру, хоча ці відносини відрізняються з різних причин. 256 байт адресного простору вважалося занадто малим ще в перші дні мікропроцесорів, тому більшість восьми бітових процесорів виробляли 16-бітові (два байтові) адреси, що стосувалися 64 кілобайт. Хоча з комутацією банків (по суті, використовуючи певні лінії вводу / виводу для отримання ще більшої кількості адресних рядків), можна було отримати набагато більше.

У перших 16 та 32-бітових процесорах не завжди було достатньо штифтів на пристрої, щоб дістати весь простір, на який могли б звертатися їхні внутрішні регістри адрес. Наприклад, у Motorola 68000 було достатньо адресних штифтів (24) для адреси 16 мегабайт оперативної пам’яті, хоча внутрішні регістри адрес були шириною 32 біти.


2

Я відповім на це питання спеціально для контролерів AVR, які ви згадали. Основний принцип справедливий і для багатьох інших 8-бітних архітектур.

AVR - це 8-бітні ядра. Це означає, що у них є 8-бітні регістри. Однак 8 біт недостатньо для доступу до потрібного обсягу пам'яті. Отже, ядро ​​AVR здатне використовувати певний набір регістрів, об'єднаних як 16-бітові регістри вказівників. Приклади для цього є регістри r30 та r31 (також відомі як ZL та ZH). Разом вони утворюють покажчик Z.

Зчитування байта за адресою 0x1234 виглядатиме так:

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

Сім'я AVR має 3 регістрові пари, які можна використовувати для цього. Вони спеціально розроблені в апараті, щоб дозволити такі операції.

Під час програмування на мові вищого рівня, як на C, компілятор обробляє цей матеріал.


Примітка: Деякі AVR підтримують навіть більші розміри пам'яті, ніж 64 Кб. Ці контролери мають спеціальний регістр функцій, в який записуються додаткові біти адреси перед доступом. Тому адреса складається з наступних бітів (MSB до LSB):

Реєстр спеціальних функцій (зазвичай 1 байт), ZH (8 біт), ZL (8 біт).


1

8-бітний AVR Atmel фактично використовує 16-бітну адресу даних. Є безліч інших 16-бітових регістрів і навіть 16-бітових таймерів. Оскільки це лише 8-бітний процесор, він зазвичай використовує два тактових цикли для завантаження 16-бітного регістра.


1

Вікіпедія пояснює це досить добре:

Вісім-бітні процесори використовують 8-бітну шину даних і тому можуть отримати доступ до 8 бітів даних в одній машинній інструкції. Адресна шина, як правило, подвійний октет шириною (тобто 16-бітною) через практичні та економічні міркування. Це означає, що для більшості 8-бітних процесорів прямий адресний простір становить всього 64 Кб.


1

Поняття про те, що "бітова ширина" процесора встановлює максимальний об'єм оперативної пам'яті, на який процесор може звернутися, є одним з найбільш розповсюджених міфів в обчислювальних технологіях. Насправді галузева історія просто всіяна процесорами, для яких такі відносини не дотримувалися.

HP 21MX, HP 1000: 16-бітний процесор, пам'ять до 16 Мб

PDP-11: 16-бітний процесор, пам'ять до 4 Мб

VAX-11/780: 32-бітний процесор, пам'ять до 512 Мб

тощо, тощо.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.