W jaki sposób 8-bitowy procesor może obsługiwać ponad 256 bajtów pamięci RAM?

14

Jeśli 32- bitowy procesor może obsłużyć około 4 GiB pamięci RAM (tj. ) bajtów, to dlaczego mój Arduino Mega 2560 ma 8 KiB SRAM, jeśli bycie 8- bitowym procesorem pozwala mu obsłużyć tylko 256 bajtów ( )? A może źle czytam następującą stronę?232=42949672962 828

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

ZaqueoAlejandro
źródło
5
Z pewnością każda kompletna maszyna Turinga jest w stanie poradzić sobie z niemal każdym rozmiarem siłownika, mając wystarczająco dużo czasu.
John U
2
W rzeczywistości liczba bitów w nazwie procesora może być wykorzystana tylko do wstępnego oszacowania wewnętrznej szerokości danych. 8088 jest 16-bitowym procesorem ze względu na swoje 16-bitowe rejestry, ale ma 8-bitową szynę danych i 20-bitową szynę adresową. 68000 jest 32-bitowym procesorem nazywanym najczęściej 16/32-bitowym z powodu swoich 32-bitowych rejestrów, ale ma 16-bitową szynę danych i 24-bitową szynę adresową. Małe implementacje ARM to procesory 32-bitowe (rejestry 32-bitowe i magistrala danych), ale nawet jeśli używają 32 bitów na adresy, nie mogą adresować łącznie 4 GB.
busybee,
Dodałem poprawne prefiksy SI dla tych jednostek. to gibi (Gi), a to kibi (Ki). 2 10230210
Elliot Alderson,
Warto wspomnieć, że wiele 8 gorzkich (szczególnie pochodnych Motoroli) obsługuje tak zwaną stronę zerową , która była zestawem instrukcji umożliwiającym nieco szybsze przetwarzanie pierwszych 256 bajtów adresowalnych w mapie pamięci. Dlatego najbardziej krytyczne czasowo rejestry sprzętowe itp. Zostałyby zmapowane do pierwszych 256 bajtów z tego powodu wydajności. Z tego powodu na wielu architekturach można znaleźć rejestry sprzętowe zmapowane od adresu zero.
Lundin
nazywając coś 8-bitowym, 16-bitowym, 32-bitowym itd., powiedzmy, termin marketingowy, inżynierowie używają go, ale rozumieją, że nie oznacza to, że wszystko w tym procesorze jest tak szerokie. niektórzy ludzie używają wielkości instrukcji, bardzo często używana jest wielkość rejestrów ogólnego przeznaczenia, czasami magistrala. masz licznik programów, który nie zawsze jest dostępny lub użyteczny w instrukcjach, dzięki czemu może być tak szeroki, jak chcą. następnie, podobnie jak w przypadku wielu procesorów typu AVR, istnieje wiele rejestrów lub schematu stronicowania, lub oba, aby uzyskać szerszy adres ładowania / przechowywania dla transakcji danych.
old_timer

Odpowiedzi:

19

Większość 8-bitowych procesorów ma 16-bitowe magistrale adresowe, co pozwala im adresować 64 KB, właśnie dlatego, że 256 bajtów naprawdę nie wystarczy do zrobienia bardzo dużo! Oznacza to po prostu, że muszą załadować dwa bajty zamiast jednego, za każdym razem, gdy muszą załadować adres. Nieco wolniejszy, ale tolerowany, biorąc pod uwagę ich rozmiar.

(I tak, istnieje wiele wyjątków, głównie opracowanych, gdy 64k stało się zbyt małe, ale mówimy tutaj o podstawowej idei).

Brian Drummond
źródło
W rzeczywistości większość 8-bitowych mikrokontrolerów, które napotkałem, nie ma adresu 16-bitowego
phuclv
@Brian Drummond Czy mam rację: Kontroler najpierw napisze dolne 8 bitów, następnie górne 8 bitów, a następnie zatrzaskuje magistralę adresową. W ten sposób uzyska dostęp do 16-bitowej magistrali adresowej!
Swanand
Lub górne 8 bitów, a następnie dolne 8 bitów, ale w zasadzie tak, taki jest pomysł.
Brian Drummond
7

Autobus adres i magistrala danych są oddzielone więc mogą one mieć różne rozmiary. Dla każdego konkretnego rozmiaru magistrali adresowej istnieje wiele technik adresowania większej ilości pamięci niż szerokość bitu rejestru

  • Najczęstszym sposobem jest jakoś zwiększenie szerokości magistrali adresowej

    • za pomocą wielu rejestrów dla adresu

      • AVR ma R26..R31, które mogą być połączone na 16-bitowe X, Yi Zdane do rejestrów adresowania zapewnić maksymalną 64 KB RAM. Ci z kolei mogą być połączone z RAMPX, RAMPY, RAMPZaby uzyskać dostęp do wyższych adresów pamięci RAM w jeszcze większych wersjach. Ma również SPHdla wysokich bajtów wskaźnika stosu oprócz SPLwariantów z ponad 256 bajtami pamięci RAM 1
      • Intel 8080 i Zilog Z80 są 8-bitowymi procesorami, ale mają pary rejestrów, takie jak H& L, B& C, Di Ektóre mogą być używane razem jako 16-bitowy rejestr adresów
    • za pomocą jednego dużego specjalnego rejestru większego niż naturalny rozmiar do adresowania

      • Intel 8051 jest 8-bitowym mikrokontrolerem, tzn. Ma 8-bitowy adres danych. Jednak wykorzystuje 16-bitowy adres instrukcji i ma 2 16-bitowe rejestry: PC i DPTR do adresowania w przestrzeni instrukcji.
      • AVR ma 16 lub 22-bitowy rejestr na PC
    • za pomocą specjalnego rejestru dla górnej części adresu . Podczas adresowania pewnej pamięci domyślnie 8 niskich bitów adresu zostanie pobranych z 8-bitowego rejestru bezpośredniego lub 8-bitowego na 8-bitowym mikrokontrolerze, podczas gdy wysokie bity zostaną zastąpione wartością drugiego rejestru adresu.

      • Szczególnym przypadkiem jest pamięć segmentowa , z której korzysta 16-bitowy procesor x86 . W tej technice pamięć jest podzielona na wiele segmentów o rozmiarze 64 KB (2 16 bajtów). Normalny dostęp jest domyślnie wewnątrz jednego segmentu, więc mogą używać adresu 16-bitowego dla danych bliskich . Dane, które są dalej od siebie muszą być adresowane konkretnie według wartości segmentu, dlatego do dalekiego adresowania należy użyć 2 rejestrów.
      • Mikrokontroler PIC , którego cykl średniej klasy bazową i może mieć adres 13 albo 14-bitowe, to kolejny przykład. Podczas używania calllub gotoinstrukcji 8 lub 9 niskich bitów adresu jest wskazywanych przez znak natychmiastowy, a pozostałe są pobierane z bieżącego licznika programu. Dlatego dostęp do czegokolwiek w pobliżu bieżącego segmentu wymaga tylko 1 instrukcji, podczas gdy dalsze adresy będą wymagały 2 instrukcji (aby ustawić wysokie bity).
      • Innym przykładem jest architektura MIPS, która łączy również niższy 26-bitowy adres bezpośredni z wysokimi 6 bitami z PCbezwarunkowego skoku.
  • Innym sposobem na osiągnięcie tego jest bankowość pamięci . Jest to przydatna metoda, która jest nadal stosowana w niektórych architekturach. W tym modelu pamięć jest podzielona na wiele banków . Za każdym razem możesz skontaktować się tylko z określonym bankiem. Często istnieje globalny bank lub zakres adresów, które są zawsze widoczne w dowolnym momencie, ale w przypadku innych części należy zmienić bank w razie potrzeby.

    • Intel 8051 korzysta z bankowości pamięci dla rejestrów. Ma 32 rejestry, ale tylko 8 z nich jest widocznych jednocześnie.
    • x86 PAE i ARM LPAE , z większą fizyczną przestrzenią adresową odwzorowaną na małą wirtualną przestrzeń adresową
    • Inną aplikacją jest rozszerzenie okien w systemie Windows, które może być używane przez 32-bitowe aplikacje x86 w trybie PAE w celu uzyskania dostępu do ponad 2/3 GB pamięci. To nie jest dokładnie tak, jak bank pamięci na mikrokontrolerach, ale może być postrzegany jako taki, ponieważ duży zakres adresów można pomyśleć o małych oknach / bankach, które są wystarczająco małe, aby zmieściły się w przestrzeni adresowej aplikacji. Jeśli aplikacja musi użyć danych w jakimś oknie, zamapuje to okno do swojej bieżącej przestrzeni adresowej.
    • DOS ma również niektóre rodzaje przełączania banków, takie jak pamięć rozszerzona lub pamięć rozszerzona ze względu na ograniczony zakres pamięci adresowalnej.
  • Istnieje również niezbyt popularna technika, ale można ją znaleźć w Intel 8051 . Jako mikrokontroler z 8-bitowym adresem danych może mieć maksymalnie 256 adresów. Połowa miejsca (część wysoka) jest wykorzystywana dla rejestrów funkcji specjalnych ( SFR ), ograniczając rzeczywistą pamięć RAM adresowalną tylko do 128 bajtów. Jednak nowi producenci serii 8051 znaleźli sprytny sposób na rozwiązanie tego problemu poprzez oddzielenie dostępu do pamięci . Adresowanie bezpośrednie uzyska dostęp do SFR, natomiast adresowanie pośrednie, ale rejestry będą uzyskiwać dostęp do dużej części pamięci RAM, co oznacza, że ​​teraz masz 256 + 128 = 384 bajtów adresowalnych.


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

Najmniejsze rdzenie mają ≤256 bajtów przestrzeni adresowej danych (co oznacza ≤128 bajtów RAM po usunięciu portów I / O i innych zarezerwowanych adresów) i ≤ 8192 bajtów (8 KiB) pamięci ROM programu. Mają one tylko 8-bitowy wskaźnik stosu (w SPL) i obsługują tylko 12-bitowe względne instrukcje skoku / wywołania RJMP / RCALL. (Ponieważ licznik programu AVR zlicza 16-bitowe słowa, a nie bajty, 12-bitowe przesunięcie jest wystarczające, aby adresować 213 bajty ROM.)

Dodatkowe funkcje adresowania pamięci są wymagane w celu uzyskania dostępu do dostępnych zasobów:

  1. Modele z> 256 bajtami przestrzeni adresowej danych (≥256 bajtów pamięci RAM) mają 16-bitowy wskaźnik stosu, z wysoką połową w rejestrze SPH.
  2. Modele z> 8 KiB ROM dodają 2-wyrazowe (22-bitowe) instrukcje JUMP i CALL. (Niektóre wczesne modele ulegają błędowi, jeśli po instrukcji pominięcia następuje instrukcja składająca się z dwóch słów).
  3. Modele z> 64 KiB ROM dodają instrukcję ELPM i odpowiedni rejestr RAMPZ. Instrukcje LPM zwiększają zero adres ROM w Z; Instrukcje ELPM poprzedzają rejestr RAMPZ dla dużych bitów. To nie to samo, co ogólniejsza instrukcja LPM; istnieją „klasyczne” modele z tylko ELPM w postaci zerotargowej (ATmega103 i at43usb320). Gdy dostępna jest funkcja automatycznego przyrostu (większość modeli), aktualizuje cały 24-bitowy adres, w tym RAMPZ.
  4. Modele (rzadkie) z> 128 KiB ROM mają 3-bajtowy licznik programów. Wywołania i powroty podprogramów wykorzystują dodatkowy bajt przestrzeni stosu, istnieje nowy rejestr EIND, który zapewnia dodatkowe wysokie bity dla skoków i wywołań indireect, a także nowe rozszerzone instrukcje EIJMP i EICALL, które używają EIND: Z jako adresu docelowego. (Poprzednie instrukcje IJMP i ICALL używają Z o rozszerzeniu zera).
  5. Modele (rzadkie) z> 64 KiB przestrzeni adresowej RAM rozszerzają 16-bitowe limity adresowania RAM za pomocą rejestrów RAMPX, RAMPY, RAMPZ i RAMPD. Zapewniają one dodatkowe wysokie bity dla trybów adresowania, które wykorzystują odpowiednio pary rejestrów X, Y lub Z, lub instrukcje bezpośredniego adresowania LDS / STS. W przeciwieństwie do dostępu do ROM, nie ma wyraźnych instrukcji „rozszerzonych”; zamiast tego rejestry RAMP są używane bezwarunkowo.
phuclv
źródło
6

Prawie wszystkie 8-bitowe procesory mają pewną zdolność do utworzenia 16-bitowego adresu z części niskiego rzędu i części wysokiego rzędu. Na niektórych procesorach, w tym na oryginalnym 8080, istnieją rejestry dedykowane do utrzymywania górnej i dolnej części adresu (chociaż z punktu widzenia programisty mogą istnieć niektóre rejestry, takie jak wskaźnik stosu 8080, który nie oferuje instrukcji, aby adresować je osobno). W niektórych innych procesorach nie ma rejestrów poświęconych górnej lub dolnej połowie adresu, ale adresy są gromadzone „w locie”. Na przykład w 6502 instrukcja „LDA 1234 $, X” ładuje akumulator adresem utworzonym przez dodanie 1234 $ do 8-bitowego rejestru X [przypuśćmy, że zawiera $ F0]. Wykonanie tej instrukcji przebiegałoby w 4 lub 5 krokach:

  1. Zakończ rejestrowanie zapisu z poprzedniej instrukcji (jeśli istnieje) i załaduj kod operacyjny ($ BD)
  2. Pobierz pierwszy bajt argumentu operacji po kodzie operacji (34 USD) podczas dekodowania instrukcji
  3. Pobierz drugi bajt operandu (12 USD), dodając uprzednio pobrany bajt do rejestru X.
  4. Odczytaj pamięć pod adresem utworzonym przez konkatenację drugiego bajtu operandu z wynikiem ALU [tj. 1224 $]. Wprowadź drugi bajt argumentu operacji do ALU, aby dodać zero lub jeden w zależności od tego, czy poprzednie dodanie wygenerowało przeniesienie
  5. Czytaj pamięć pod adresem utworzonym przez zastąpienie górnej połowy wynikiem ALU [1334 $]

Przeniesienie odczytanego bajtu do akumulatora nakłada się na pobranie następnej instrukcji. Ponadto w przypadku wielu operacji, jeżeli krok 3 nie wygenerował przeniesienia, krok 4 odczytałby poprawny adres, a wykonanie mogłoby przejść bezpośrednio od kroku 4 do następnej instrukcji, omijając krok 5.

Jeśli przeanalizujemy sekwencję operacji, zauważymy, że architektura little-endian ma wyraźną przewagę nad architekturą big-endian, w tym w większości przypadków (choć nie pokazana), mimo że ALU wykonuje cykl w celu wykonania dodatkowo możliwe jest odczytanie bajtu z obliczonego adresu bez czekania na wynik ALU, ponieważ zwykle pobrany bajt wysoki będzie bajtem operandu docelowego. Na maszynie typu big-endian z 8-bitowym ALU obciążenie indeksowane zajęłoby co najmniej 5 cykli (ponieważ dolna połowa adresu nie byłaby odczytana aż do kroku 3, a zatem zostałaby obliczona w kroku 4).

supercat
źródło
Pamiętam kilka reklam na komputery z procesorami 8-bitowymi i 1 megabajtem pamięci. W tym celu wykorzystano dwa 8-bitowe rejestry na CPU plus jeden 8-bitowy rejestr poza CPU, aby utworzyć cały adres.
user6030
@ user6030: Istnieje wiele sposobów na osiągnięcie takich celów. Zazwyczaj części przestrzeni adresowej będą „stałe”, a inne będą wybierane przez banki. Niektóre urządzenia działają dobrze dla programistów; wiele innych, nie tak bardzo.
supercat
6

Linie magistrali danych (piny) i linie adresu (piny) są całkowicie oddzielne. Mówiąc najprościej, linie magistrali określają maksymalną liczbę bitów, które mogą być przesyłane pojedynczo (i przechowywane w pamięci), podczas gdy linie adresowe określają maksymalną liczbę „komórek” pamięci, które można wybrać.

Było to głównie kwestia marketingowa, że ​​32-bitowe procesory x86 nie były w stanie obsłużyć więcej niż 4 GB pamięci RAM. Pamiętam gdzieś, że na procesorach Pentium 4 były piny A33-34.

dprogrammer
źródło
1
Masz rację - PAE zezwoliło na użycie większej ilości pamięci RAM, ale ponieważ nie była ona dostępna na komputerze z systemem Windows, niewiele osób kiedykolwiek z niej korzystało.
pjc50
264
Procesory x86 nie mogą obsłużyć więcej niż 4 GB bez znaczących komplikacji w systemie operacyjnym, które nie są przenoszone na inne architektury.
Kaz
1
32-bitowy @Kaz ARM ma podobną funkcję o nazwie LPAE, która pozwala systemowi operacyjnemu adresować ponad 32 bity adresu
phuclv
3

Często jest prawdą, że istnieje pewien związek między wielkością pamięci adresowalnej a wielkością rejestru wewnętrznego, chociaż związek ten jest różny z różnych powodów. 256 bajtów przestrzeni adresowej było uważane za zbyt małe nawet w bardzo wczesnych dniach mikroprocesorów, więc większość ośmiobitowych procesorów wytwarzała 16-bitowe (dwa bajty) adresy, które adresowały 64 kilobajty. Jednak dzięki przełączaniu banków (zasadniczo wykorzystując pewne linie we / wy do wytworzenia jeszcze większej liczby linii adresowych) możliwe było uzyskanie znacznie więcej.

W pierwszych 16 i 32-bitowych procesorach urządzenie nie zawsze miało wystarczającą liczbę pinów, aby uzyskać dostęp do całej przestrzeni, którą mogłyby adresować ich wewnętrzne rejestry adresowe. Na przykład w telefonie Motorola 68000 było tylko wystarczającej liczby pinów adresu (24), aby zaadresować 16 megabajtów pamięci RAM, chociaż wewnętrzne rejestry adresów miały szerokość 32 bitów.

Gus Mueller
źródło
2

Odpowiem na to pytanie specjalnie dla wspomnianych kontrolerów AVR. Podstawowa zasada obowiązuje również w przypadku wielu innych architektur 8-bitowych.

AVR to 8-bitowe rdzenie. Oznacza to, że mają 8-bitowe rejestry. Jednak 8 bitów nie wystarczy, aby uzyskać dostęp do użytecznej ilości pamięci. Dlatego rdzeń AVR może używać określonego zestawu rejestrów połączonych jako 16-bitowe rejestry wskaźników. Rejestry r30 i r31 (również aliasowane jako ZL i ZH) są tego przykładem. Razem tworzą wskaźnik Z.

W zestawie odczytanie bajtu pod adresem 0x1234 wygląda następująco:

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

Rodzina AVR ma 3 pary rejestrów, których można użyć do tego. Są one specjalnie zaprojektowane sprzętowo, aby umożliwić takie operacje.

Podczas programowania w języku wyższego poziomu, takim jak C, kompilator obsługuje te rzeczy.


Uwaga: Niektóre AVR obsługują nawet większe rozmiary pamięci niż 64 KB. Kontrolery te mają specjalny rejestr funkcji, w którym dodatkowe bity adresu są zapisywane przed dostępem. Adres składa się zatem z następujących bitów (MSB do LSB):

Rejestr funkcji specjalnych (zwykle 1 bajt), ZH (8 bitów), ZL (8 bitów).

GNA
źródło
1

8-bitowe AVR Atmela faktycznie używają 16-bitowego adresu danych. Mają wiele innych 16-bitowych rejestrów, a nawet około 16-bitowych timerów. Ponieważ jest to tylko 8-bitowy procesor, zwykle używa dwóch cykli zegara do załadowania rejestru 16-bitowego.

Garrett Fogerlie
źródło
1

Wikipedia całkiem dobrze to wyjaśnia:

8-bitowe procesory używają 8-bitowej magistrali danych, dzięki czemu mogą uzyskiwać dostęp do 8 bitów danych w pojedynczej instrukcji maszyny. Magistrala adresowa ma zwykle szerokość podwójnego oktetu (tj. 16 bitów), ze względów praktycznych i ekonomicznych. Oznacza to bezpośrednią przestrzeń adresową o wielkości zaledwie 64 KB na większości procesorów 8-bitowych.

Kamil
źródło
1

Pojęcie, że „szerokość bitów” procesora określa maksymalną ilość pamięci RAM, którą procesor może rozwiązać, jest jednym z najbardziej rozpowszechnionych mitów w przetwarzaniu. W rzeczywistości historia branży jest zaśmiecona procesorami, dla których ta relacja nie miała miejsca.

HP 21MX, HP 1000: 16-bitowy procesor, pamięć do 16 MB

PDP-11: 16-bitowy procesor, pamięć do 4 MB

VAX-11/780: 32-bitowy procesor, pamięć do 512 MB

itd itd.

Jamie Hanrahan
źródło