Kapitola 6: Základy moderní počítačové architektury s jazykem symbolických instrukcí

Kapitola 6 Zaklady Moderni Pocitacove Architektury S Jazykem Symbolickych Instrukci



6.1 Úvod

Moderní univerzální počítače jsou dvou typů: CISC a RISC. CISC znamená Complex Instruction Set Computer. RISK znamená počítač se sníženou instrukční sadou. Mikroprocesory 6502 nebo 6510, jak jsou použitelné pro počítač Commodore-64, připomínají spíše architekturu RISC než architekturu CISC.

Počítače RISC mají obecně kratší instrukce v assembleru (podle počtu bajtů) ve srovnání s počítači CISC.







Poznámka : Ať už jde o počítač CISC, RISC nebo starý počítač, periferie začíná vnitřním portem a jde ven přes externí port na svislém povrchu systémové jednotky počítače (základní jednotky) a k externímu zařízení.



Typickou instrukci počítače CISC lze považovat za spojení několika krátkých instrukcí v jazyce symbolických instrukcí do jedné delší instrukce v jazyce symbolických instrukcí, což činí jednu výslednou instrukci složitou. Konkrétně počítač CISC načte operandy z paměti do registrů mikroprocesoru, provede operaci a poté uloží výsledek zpět do paměti, vše v jedné instrukci. Na druhou stranu se jedná o minimálně tři instrukce (krátké) pro počítač RISC.



Existují dvě oblíbené řady počítačů CISC: mikroprocesorové počítače Intel a mikroprocesorové počítače AMD. AMD znamená Advanced Micro Devices; jedná se o společnost vyrábějící polovodiče. Série mikroprocesorů intel v pořadí vývoje jsou 8086, 8088, 80186, 80286, 80386, 80486, Pentium, Core, i Series, Celeron a Xeon. Instrukce v assembleru pro rané mikroprocesory Intel, jako jsou 8086 a 8088, nejsou příliš složité. Pro nové mikroprocesory jsou však složité. Nedávné mikroprocesory AMD pro řadu CISC jsou Ryzen, Opteron, Athlon, Turion, Phenom a Sempron. Mikroprocesory Intel a AMD jsou známé jako mikroprocesory x86.





ARM je zkratka pro Advanced RISC Machine. Architektury ARM definují rodinu RISC procesorů, které jsou vhodné pro použití v široké škále aplikací. Zatímco mnoho mikroprocesorů Intel a AMD se používá ve stolních osobních počítačích, mnoho procesorů ARM slouží jako vestavěné procesory v systémech kritických z hlediska bezpečnosti, jako jsou automobilové protiblokovací brzdy, a jako univerzální procesory v chytrých hodinkách, přenosných telefonech, tabletech a přenosných počítačích. . Přestože oba typy mikroprocesorů lze vidět v malých i velkých zařízeních, mikroprocesory RISC se nacházejí spíše v malých zařízeních než ve velkých zařízeních.

Počítačové slovo
Pokud se o počítači říká, že je to počítač 32bitového slova, znamená to, že informace jsou ukládány, přenášeny a manipulovány ve formě 32bitových binárních kódů ve vnitřní části základní desky. Znamená to také, že univerzální registry v mikroprocesoru počítače jsou široké 32 bitů. Registry A, X a Y mikroprocesoru 6502 jsou registry pro všeobecné použití. Jsou osm bitů široké, takže počítač Commodore-64 je osmibitový slovní počítač.



Nějaká slovní zásoba
Počítače X86

Významy byte, word, doubleword, quadword a double-quadword jsou pro počítače x86 následující:

  • Byte : 8 bitů
  • Slovo : 16 bitů
  • Doubleword : 32 bitů
  • Quadword : 64 bitů
  • Dvojité čtyřslovo : 128 bitů

Počítače ARM
Významy byte, halfword, word a doubleword jsou pro počítače ARM následující:

  • Byte : 8 bitů
  • Staňte se polovinou : 16 bitů
  • Slovo : 32 bitů
  • Doubleword : 64 bitů

Je třeba poznamenat rozdíly a podobnosti názvů x86 a ARM (a hodnot).

Poznámka : Znaménková celá čísla v obou typech počítačů jsou doplňkem dvou.

Umístění paměti
U počítače Commodore-64 je umístění paměti obvykle jeden bajt, ale příležitostně to mohou být dva po sobě jdoucí bajty, když se zvažují ukazatele (nepřímé adresování). U moderního počítače x86 je paměťové místo 16 po sobě jdoucích bajtů při práci s dvojitým čtyřslovem 16 bajtů (128 bitů), 8 po sobě jdoucích bajtů při práci s čtyřslovem 8 bajtů (64 bitů), 4 po sobě jdoucí bajty při práci s dvojslovem 4 bajty (32 bitů), 2 po sobě jdoucí bajty při práci se slovem o velikosti 2 bajtů (16 bitů) a 1 bajt při práci s bajtem (8 bitů). U moderního počítače ARM je paměťové místo 8 po sobě jdoucích bajtů při práci s dvojslovem 8 bajtů (64 bitů), 4 po sobě jdoucí bajty při práci se slovem o 4 bytech (32 bitů), 2 po sobě jdoucí bajty při práci s půlslovem 2 bajty (16 bitů) a 1 bajt při práci s bytem (8 bitů).

Tato kapitola vysvětluje, co je společné v architektuře CISC a RISC a jaké jsou jejich rozdíly. To je provedeno ve srovnání s 6502 µP a počítačem commodore-64, kde je to použitelné.

6.2 Blokové schéma základní desky moderního PC

PC je zkratka pro osobní počítač. Následuje obecné základní blokové schéma moderní základní desky s jedním mikroprocesorem pro osobní počítač. Představuje základní desku CISC nebo RISC.


Obr. 6.21 Základní blokové schéma základní desky moderního PC

Ve schématu jsou znázorněny tři vnitřní porty, ale v praxi je jich více. Každý port má registr, který lze považovat za samotný port. Každý obvod portu má alespoň další registr, který lze nazvat „stavový registr“. Stavový registr označuje port programu, který vysílá signál přerušení do mikroprocesoru. Existuje obvod řadiče přerušení (není zobrazen), který rozlišuje mezi různými přerušovacími linkami z různých portů a má jen několik linek k µP.

HD.C ve schématu znamená Hard Drive Card. NIC je zkratka pro Network Interface Card. Karta pevného disku (obvod) je připojena k pevnému disku, který je uvnitř základní jednotky (systémové jednotky) moderního počítače. Karta síťového rozhraní (obvod) je připojena pomocí externího kabelu k jinému počítači. Na obrázku je jeden port a DMA (viz následující obrázek), které jsou připojeny ke kartě pevného disku a/nebo ke kartě síťového rozhraní. DMA je zkratka pro Direct Memory Access.

Pamatujte z kapitoly o počítači Commodore-64, že aby bylo možné poslat bajty z paměti na diskovou jednotku nebo jiný počítač, musí být každý bajt zkopírován do registru v mikroprocesoru před zkopírováním na odpovídající interní port a poté automaticky k zařízení. Aby bylo možné přijmout bajty z diskové jednotky nebo jiného počítače do paměti, musí být každý bajt před zkopírováním do paměti zkopírován z odpovídajícího registru interního portu do registru mikroprocesoru. To obvykle trvá dlouho, pokud je počet bajtů v datovém proudu velký. Řešením pro rychlý přenos je použití Direct Memory Access (obvodu) bez průchodu přes mikroprocesor.

Obvod DMA je mezi portem a HD. C nebo NIC. S přímým přístupem do paměti obvodu DMA probíhá přenos velkých proudů bajtů přímo mezi obvodem DMA a pamětí (RAM) bez pokračující účasti mikroprocesoru. DMA používá adresovou sběrnici a datovou sběrnici místo µP. Celková doba přenosu je kratší než při použití µP hard. Jak HD C., tak NIC používají DMA, když mají velký tok dat (bajtů) pro přenos s RAM (pamětí).

GPU je zkratka pro Graphics Processing Unit. Tento blok na základní desce je zodpovědný za odesílání textu a pohyblivých nebo statických obrázků na obrazovku.

U moderních počítačů (PC) neexistuje paměť pouze pro čtení (ROM). Existuje však BIOS nebo UEFI, což je druh energeticky nezávislé paměti RAM. Informace v BIOSu jsou ve skutečnosti udržovány baterií. Baterie je to, co ve skutečnosti také udržuje časovač hodin, ve správný čas a datum pro počítač. UEFI bylo vynalezeno po BIOSu a nahradilo BIOS, ačkoli BIOS je v moderních počítačích stále docela relevantní. Více o nich probereme později!

V moderních počítačích nejsou adresové a datové sběrnice mezi µP a vnitřními obvody portu (a pamětí) paralelními sběrnicemi. Jsou to sériové sběrnice, které potřebují dva vodiče pro přenos v jednom směru a další dva vodiče pro přenos v opačném směru. To například znamená, že 32 bitů lze posílat v sérii (jeden bit za druhým) v obou směrech.

Pokud je sériový přenos pouze v jednom směru se dvěma vodiči (dvě linky), říká se, že je to poloduplexní. Pokud je sériový přenos v obou směrech se čtyřmi vodiči, jeden pár v každém směru, říká se, že je plně duplexní.

Celá paměť moderního počítače se stále skládá z řady umístění bajtů: osm bitů na bajt. Moderní počítač má paměťový prostor alespoň 4 gigabajty = 4 x 210 x 2 10 x 2 10 = 4 x 1 073 741 824 10 bajtů = 4 x 1024 10/sub> x 1024 10 x 1024 10 = 4 x 1 073 741 824 10 .

Poznámka : Ačkoli na předchozí základní desce není zobrazen žádný obvod časovače, všechny moderní základní desky mají obvody časovače.

6.3 Základy počítačové architektury x64

6.31 Sada registrů x64
64bitový mikroprocesor řady mikroprocesorů x86 je 64bitový mikroprocesor. Nahradit 32bitový procesor stejné řady je celkem moderní. Obecné registry 64bitového mikroprocesoru a jejich názvy jsou následující:


Obr. 6.31 General Purpose Registers for x64

Na uvedeném obrázku je zobrazeno šestnáct (16) registrů pro všeobecné použití. Každý z těchto registrů je široký 64 bitů. Při pohledu na registr v levém horním rohu je 64 bitů identifikováno jako RAX. Prvních 32 bitů stejného registru (zprava) je identifikováno jako EAX. Prvních 16 bitů stejného registru (zprava) je identifikováno jako AX. Druhý bajt (zprava) stejného registru je označen jako AH (H zde znamená vysoký). A první bajt (tohoto registru) je identifikován jako AL (L zde znamená nízký). Při pohledu na registr v pravém dolním rohu je 64 bitů označeno jako R15. Prvních 32 bitů stejného registru je označeno jako R15D. Prvních 16 bitů stejného registru je označeno jako R15W. A první bajt je označen jako R15B. Názvy ostatních registrů (a podregistrů) jsou vysvětleny podobně.

Mezi procesory Intel a AMD µP jsou určité rozdíly. Informace v této části jsou určeny společnosti Intel.

U 6502 µP je registr programového čítače (nepřístupný přímo), který uchovává další instrukci, která má být provedena, široký 16 bitů. Zde (x64) se čítač programu nazývá Instruction Ukazatel a je široký 64 bitů. Je označen jako RIP. To znamená, že x64 µP může adresovat až 264 = 1,844674407 x 1019 (ve skutečnosti 18,446,744,073,709,551,616) paměťových bajtů. RIP není univerzální registr.

Stack Pointer Register nebo RSP patří mezi 16 obecných registrů. Ukazuje na poslední položku zásobníku v paměti. Stejně jako u 6502 µP roste zásobník pro x64 směrem dolů. U x64 se zásobník v RAM používá k ukládání návratových adres pro podprogramy. Používá se také pro ukládání „stínového prostoru“ (viz následující diskuse).

6502 µP má 8bitový stavový registr procesoru. Ekvivalent v x64 se nazývá registr RFLAGS. Tento registr uchovává příznaky, které se používají pro výsledky operací a pro řízení procesoru (µP). Je široký 64 bitů. Vyšších 32 bitů je vyhrazeno a aktuálně se nepoužívají. Následující tabulka uvádí názvy, index a významy běžně používaných bitů v registru RFLAGS:

Tabulka 6.31.1
Nejpoužívanější RFLAGS Flags (bity)
Symbol Bit název Účel
CF 0 Nést Nastavuje se, pokud aritmetická operace generuje přenos nebo výpůjčku z nejvýznamnějšího bitu výsledku; vymazáno jinak. Tento příznak označuje podmínku přetečení pro aritmetiku celého čísla bez znaménka. Používá se také v aritmetice s vícenásobnou přesností.
PF 2 Parita Nastavuje se, pokud nejméně významný bajt výsledku obsahuje sudý počet 1 bitů; vymazáno jinak.
Z 4 Upravit Nastavuje se, pokud aritmetická operace generuje přenos nebo výpůjčku z bitu 3 výsledku; vymazáno jinak. Tento příznak se používá v binárně kódované desítkové (BCD) aritmetice.
ZF 6 Nula Nastaví se, pokud je výsledek nula; vymazáno jinak.
SF 7 Podepsat Nastavuje se, pokud se rovná nejvýznamnějšímu bitu výsledku, což je znaménkový bit celého čísla se znaménkem (0 označuje kladnou hodnotu a 1 označuje zápornou hodnotu).
Z jedenáct Přetékat Nastavuje se, pokud je výsledkem celé číslo příliš velké kladné číslo nebo příliš malé záporné číslo (bez znaménkového bitu), aby se vešlo do cílového operandu; vymazáno jinak. Tento příznak označuje podmínku přetečení pro aritmetiku celého čísla se znaménkem (doplňku dvojky).
DF 10 Směr Nastavuje se, pokud instrukce směrového řetězce fungují (inkrementace nebo dekrementace).
ID dvacet jedna Identifikace Je nastaveno, pokud proměnlivost označuje přítomnost instrukce CPUID.

Kromě osmnácti 64bitových registrů, které byly uvedeny dříve, má architektura x64 µP osm registrů o šířce 80 bitů pro aritmetiku s pohyblivou řádovou čárkou. Těchto osm registrů lze také použít jako registry MMX (viz následující diskuse). Existuje také šestnáct 128bitových registrů pro XMM (viz následující diskuse).

To není vše o registrech. Existuje více registrů x64, což jsou segmentové registry (většinou nepoužívané v x64), řídicí registry, registry správy paměti, ladicí registry, virtualizační registry, výkonnostní registry, které sledují všechny druhy vnitřních parametrů (zásahy/chyby v mezipaměti, provedené mikrooperace, časování , a mnohem víc).

SIMD

SIMD znamená Single Instruction Multiple Data. To znamená, že jedna instrukce v assembleru může působit na více dat současně v jednom mikroprocesoru. Zvažte následující tabulku:

1 2 3 4 5 6 7 8
+ 9 10 jedenáct 12 13 14 patnáct 16
= 10 12 14 16 18 dvacet 22 24

V této tabulce je paralelně přidáno osm dvojic čísel (ve stejné době), aby bylo získáno osm odpovědí. Jedna instrukce jazyka symbolických instrukcí může provádět osm paralelních celočíselných sčítání v registrech MMX. Podobnou věc lze provést s registry XMM. Takže existují instrukce MMX pro celá čísla a instrukce XMM pro plovoucí.

6.32 Mapa paměti a x64

S Instruction Pointer (Program Counter) majícím 64 bitů to znamená, že lze adresovat 264 = 1,844674407 x 1019 paměťových bajtů. V hexadecimální soustavě je umístění nejvyššího bajtu FFFF,FFFF,FFFF,FFFF16. Žádný běžný počítač dnes nemůže poskytnout tak velký paměťový (kompletní) prostor. Takže vhodná mapa paměti pro počítač x64 je následující:

Všimněte si, že mezera od 0000,8000,0000,000016 do FFFF,7FFF,FFFF,FFFF16 nemá žádná paměťová místa (žádné paměťové RAM banky). To je rozdíl FFFF, 0000 0000 000 116, což je docela velký. Kanonická horní polovina obsahuje operační systém, zatímco kanonická nízká polovina obsahuje uživatelské programy (aplikace) a data. Operační systém se skládá ze dvou částí: malé UEFI (BIOS) a velké části, které se načítají z pevného disku. Další kapitola hovoří více o moderních operačních systémech. Všimněte si podobnosti s touto mapou paměti a pro Commodore-64, kdy 64 KB mohlo vypadat jako hodně paměti.

V tomto kontextu se operační systém nazývá zhruba „kernel“. Jádro je podobné jádru počítače Commodore-64, ale má mnohem více podprogramů.

Endianness pro x64 je little endian, což znamená, že pro umístění ukazuje nižší adresa na nižší obsahový bajt v paměti.

6.33 Režimy adresování v assembleru pro x64

Režimy adresování jsou způsoby, kterými může instrukce přistupovat k µP registrům a paměti (včetně interních portových registrů). x64 má mnoho režimů adresování, ale jsou zde adresovány pouze běžně používané režimy adresování. Obecná syntaxe instrukce zde je:

cíl operačního kódu, zdroj

Desetinná čísla se zapisují bez předpony nebo přípony. U 6502 je zdroj implicitní. x64 má více operačních kódů než 6502, ale některé operační kódy mají stejné mnemotechnické pomůcky. Jednotlivé x64 instrukce mají proměnnou délku a mohou mít velikost od 1 do 15 bajtů. Běžně používané režimy adresování jsou následující:

Režim okamžitého adresování
Zde je zdrojovým operandem skutečná hodnota, nikoli adresa nebo štítek. Příklad (přečtěte si komentář):

PŘIDAT EAX, 14 ; přidat dekadické 14 do 32bitového EAX 64bitového RAX, odpověď zůstane v EAX (cíl)

Zaregistrujte se do režimu registrace adresování
Příklad:

PŘIDAT R8B, AL ; přidat 8bitovou AL RAX k R8B 64bitové R8 – odpovědi zůstávají v R8B (cíl)

Režim nepřímého a indexovaného adresování
Nepřímé adresování s 6502 µP znamená, že umístění dané adresy v instrukci má efektivní adresu (ukazatel) konečného umístění. Podobná věc se stane s x64. Indexové adresování s 6502 µP znamená, že obsah registru µP je přidán k dané adrese v instrukci, aby měl efektivní adresu. Podobná věc se stane s x64. U x64 lze také obsah registru před přidáním k dané adrese vynásobit 1 nebo 2 nebo 4 nebo 8. Instrukce mov (copy) x64 může kombinovat nepřímé i indexované adresování. Příklad:

MOV R8W, 1234[8*RAX+RCX] ; přesunout slovo na adresu (8 x RAX + RCX) + 1234

Zde má R8W prvních 16 bitů R8. Uvedená adresa je 1234. Registr RAX má 64bitové číslo, které se vynásobí 8. Výsledek se přičte k obsahu 64bitového registru RCX. Tento druhý výsledek se přičte k dané adrese, která je 1234, aby se získala efektivní adresa. Číslo v místě efektivní adresy se přesune (zkopíruje) na první 16bitové místo (R8W) registru R8 a nahradí vše, co tam bylo. Všimněte si použití hranatých závorek. Pamatujte, že slovo v x64 má šířku 16 bitů.

RIP relativní adresování
Pro 6502 µP se relativní adresování používá pouze s instrukcemi větvení. Tam je jediným operandem operačního kódu offset, který je přidán nebo odečten od obsahu programového čítače pro efektivní adresu instrukce (nikoli datovou adresu). Podobná věc se stane s x64, kde je programový čítač nazýván jako ukazatel instrukcí. Instrukce s x64 nemusí být pouze větvená instrukce. Příklad adresování relativního k RIP je:

MOV AL, [RIP]

AL RAX má 8bitové číslo se znaménkem, které se přičte nebo odečte od obsahu v RIP (64bitový ukazatel instrukce), aby ukázal na další instrukci. Všimněte si, že zdroj a cíl jsou v této instrukci výjimečně zaměněny. Všimněte si také použití hranatých závorek, které odkazují na obsah RIP.

6.34 Běžně používané instrukce x64

V následující tabulce * znamená různé možné přípony podmnožiny operačních kódů:

Tabulka 6.34.1
Běžně používané pokyny v x64
Operační kód Význam
MOV Přesun (kopírování) do/z/mezi pamětí a registry
CMOV* Různé podmíněné pohyby
XCHG Výměna
BSWAP Výměna bajtů
PUSH/POP Využití zásobníku
PŘIDAT/ADC Přidat/s přenášením
SUB/SBC Odečíst/s přenášením
MUL/IMUL Násobit/neznaménko
DIV/IDIV Rozdělit/nepodepsané
INC/DEC Zvýšení/snížení
NEG Negovat
CMP Porovnejte
A/NEBO/XOR/NE Bitové operace
SHR/SAR Shift vpravo logický/aritmetický
SHL/SAL Shift vlevo logický/aritmetický
ROR/ROLE Otočit doprava/doleva
RCR/RCL Otočte doprava/doleva skrz nosný bit
BT/BTS/BTR Bit test/a nastavení/a reset
JMP Bezpodmínečný skok
JE/JNE/JC/JNC/J* Skoč, pokud je stejný/není stejný/nos/nenos/mnoho dalších
PROCHÁZET/PROCHÁZET/PROCHÁZET Smyčka s ECX
ZAVOLAT/OPAKOVAT Volání podprogramu/návratu
NOP Žádná operace
CPUID informace o CPU

x64 má instrukce násobení a dělení. Má ve svém µP hardwarové obvody pro násobení a dělení. 6502 µP nemá hardwarové obvody pro násobení a dělení. Je rychlejší provést násobení a dělení podle hardwaru než pomocí softwaru (včetně posouvání bitů).

Pokyny pro řetězec
Existuje řada řetězcových instrukcí, ale jediná, o které zde bude řeč, je instrukce MOVS (pro přesunutí řetězce) pro zkopírování řetězce začínajícího na adrese C000. H . Začít na adrese C100 H , použijte následující návod:

MOVS [C100H], [C000H]

Všimněte si přípony H pro šestnáctkové číslo.

6.35 Opakování v x64

6502 µP má větvení instrukce pro smyčkování. Instrukce větve skočí na adresu, která má novou instrukci. Umístění adresy může být nazýváno „smyčka“. x64 má instrukce LOOP/LOOPE/LOOPNE pro smyčkování. Tato vyhrazená slova v jazyce symbolických instrukcí nelze zaměňovat se štítkem „smyčka“ (bez uvozovek). Chování je následující:

LOOP snižuje ECX a kontroluje, zda ECX není nula. Pokud je tato podmínka (nula) splněna, skočí se na zadaný štítek. V opačném případě propadne (pokračujte zbytkem pokynů v následující diskusi).

LOOPE sníží ECX a zkontroluje, že ECX není nula (může být například 1) a ZF je nastaveno (na 1). Pokud jsou tyto podmínky splněny, skočí na štítek. Jinak to propadne.

LOOPNE sníží ECX a zkontroluje, že ECX není nula a ZF NENÍ nastaveno (tj. je nulové). Pokud jsou tyto podmínky splněny, skočí na štítek. Jinak to propadne.

U x64 registr RCX nebo jeho dílčí části, jako ECX nebo CX, drží celé číslo čítače. S instrukcemi LOOP počítadlo normálně odpočítává a snižuje se o 1 pro každý skok (smyčku). V následujícím segmentu smyčkového kódu se číslo v registru EAX zvyšuje z 0 na 10 v deseti iteracích, zatímco číslo v ECX se 10krát odpočítává (snižuje) (přečtěte si komentáře):

MOV EAX, 0 ;
MOV ECX, 10 ; ve výchozím nastavení odpočítávejte 10krát, jednou pro každou iteraci
označení:
INC EAX; inkrementujte EAX jako tělo smyčky
štítek LOOP ; dekrementujte EAX, a pokud EAX není nula, znovu spusťte tělo smyčky z „label:“

Kódování smyčky začíná od „label:“. Všimněte si použití dvojtečky. Kódování smyčky končí „LOOP label“, který říká dekrementaci EAX. Pokud její obsah není nulový, vraťte se k instrukci za „label:“ a proveďte znovu jakoukoli instrukci (všechny instrukce těla), která se dostane dolů, dokud se nezobrazí „LOOP label“. Všimněte si, že „štítek“ může mít stále jiný název.

6.36 Vstup/výstup x64

Tato část kapitoly se zabývá odesíláním dat na výstupní (interní) port nebo přijímáním dat ze vstupního (interního) portu. Čipset má osmibitové porty. Jakékoli dva po sobě jdoucí 8bitové porty lze považovat za 16bitový port a jakékoli čtyři po sobě jdoucí porty mohou být 32bitovým portem. Tímto způsobem může procesor přenést 8, 16 nebo 32 bitů do nebo z externího zařízení.

Informace lze přenášet mezi procesorem a interním portem dvěma způsoby: pomocí toho, co je známo jako vstup/výstup mapovaný do paměti, nebo pomocí samostatného prostoru adres vstupu/výstupu. Paměťově mapovaný I/O je podobný tomu, co se děje s procesorem 6502, kde jsou adresy portů ve skutečnosti součástí celého paměťového prostoru. V tomto případě při odesílání dat na konkrétní adresní místo jdou na port a ne do paměťové banky. Porty mohou mít samostatný I/O adresní prostor. V tomto druhém případě mají všechny paměťové banky své adresy od nuly. Existuje samostatný rozsah adres od 0000H do FFFF16. Ty jsou využívány porty v čipsetu. Základní deska je naprogramována tak, aby nedošlo k záměně mezi paměťově mapovanými I/O a samostatným I/O adresním prostorem.

I/O mapované v paměti
S tím jsou porty považovány za paměťová místa a normální operační kódy používané mezi pamětí a µP se používají pro přenos dat mezi µP a porty. Chcete-li tedy přesunout bajt z portu na adrese F000H do registru µP RAX:EAX:AX:AL, proveďte následující:

MOV AL, [F000H]

Řetězec lze přesunout z paměti do portu a naopak. Příklad:

MOVS [F000H], [C000H]; zdroj je C000H a cíl je port na F000H.

Oddělený I/O adresní prostor

K tomu je třeba použít speciální instrukce pro vstup a výstup.

Přenos jednotlivých položek
Registr procesoru pro přenos je RAX. Ve skutečnosti je to RAX:EAX pro dvojslovo, RAX:EAX:AX ​​pro slovo a RAX:EAX:AX:AL pro byte. Chcete-li tedy přenést bajt z portu na FFF0h do RAX:EAX:AX:AL, zadejte následující:

V AL, [FFF0H]

Pro zpětný převod zadejte následující:

OUT [FFF0H], AL

Takže pro jednotlivé položky jsou pokyny IN a OUT. Adresu portu lze také zadat v registru RDX:EDX:DX.

Přenos řetězců
Řetězec lze přenést z paměti do portu čipové sady a naopak. Chcete-li přenést řetězec z portu na adrese FFF0H do paměti, začněte na C100H, zadejte:

INS [ESI], [DX]

který má stejný účinek jako:

INS [EDI], [DX]

Programátor by měl vložit dvoubajtovou adresu portu FFF0H do registru RDX:EDX:Dx a dvoubajtovou adresu C100H by měl vložit do registru RSI:ESI nebo RDI:EDI. Pro zpětný převod proveďte následující:

INS [DX], [ESI]

který má stejný účinek jako:

INS [DX], [EDI]

6.37 Zásobník v x64

Stejně jako procesor 6502 má i procesor x64 zásobník v paměti RAM. Zásobník pro x64 může být 2 16 = 65 536 bajtů dlouhý nebo to může být 2 32 = délka 4 294 967 296 bajtů. Roste i směrem dolů. Když je obsah registru vložen do zásobníku, číslo v ukazateli zásobníku RSP se sníží o 8. Pamatujte, že adresa paměti pro x64 je široká 64 bitů. Hodnota v ukazateli zásobníku v µP ukazuje na další místo v zásobníku v RAM. Když je obsah registru (nebo hodnota v jednom operandu) přesunut ze zásobníku do registru, číslo v ukazateli zásobníku RSP se zvýší o 8. Operační systém rozhoduje o velikosti zásobníku a o tom, kde v RAM začne a roste směrem dolů. Pamatujte, že stack je struktura Last-In-First-Out (LIFO), která v tomto případě roste směrem dolů a zmenšuje se směrem nahoru.

Chcete-li přenést obsah registru µP RBX do zásobníku, postupujte takto:

PUSH RBX

Chcete-li vrátit poslední položku v zásobníku zpět do RBX, postupujte takto:

POP RBX

6.38 Postup v x64

Podprogram v x64 se nazývá „procedura“. Zásobník se zde používá více než pro 6502 µP. Syntaxe procedury x64 je:

název_proc:
procesní orgán

že jo

Než budete pokračovat, všimněte si, že operační kódy a štítky pro podprogram x64 (obecně pokyny pro jazyk sestavování) nerozlišují malá a velká písmena. To znamená, že proc_name je stejný jako PROC_NAME. Stejně jako u 6502 začíná název procedury (label) na začátku nového řádku v textovém editoru pro jazyk symbolických instrukcí. Následuje dvojtečka a ne mezera a operační kód jako u 6502. Následuje tělo podprogramu, které končí RET a ne RTS jako u 6502 µP. Stejně jako u 6502 každá instrukce v těle, včetně RET, nezačíná na začátku svého řádku. Upozorňujeme, že štítek zde může mít více než 8 znaků. Chcete-li tuto proceduru zavolat nad nebo pod zadanou procedurou, proveďte následující:

CALL název_proc

U 6502 je název štítku pouze typ pro volání. Zde se však zadává vyhrazené slovo „CALL“ nebo „call“ a za mezerou následuje název procedury (podprogramu).

Při řešení procedur se obvykle jedná o dva postupy. Jedna procedura volá druhou. Procedura, která volá (má instrukci volání), se nazývá „volající“ a procedura, která je volána, se nazývá „volaný“. Je třeba dodržovat konvenci (pravidla).

Pravidla volajícího

Volající by měl při vyvolání podprogramu dodržovat následující pravidla:

1. Před voláním podprogramu by měl volající uložit do zásobníku obsah určitých registrů, které jsou označeny jako uložené pro volajícího. Registry uložené pro volajícího jsou R10, R11 a všechny registry, do kterých jsou parametry vloženy (RDI, RSI, RDX, RCX, R8, R9). Pokud má být obsah těchto registrů zachován během volání podprogramu, vložte je do zásobníku namísto uložení do paměti RAM. Ty musí být provedeny, protože registry musí použít volaný k vymazání předchozího obsahu.

2. Pokud je procedurou například přidání dvou čísel, jsou tato dvě čísla parametry, které mají být předány do zásobníku. Chcete-li parametry předat podprogramu, vložte jich šest do následujících registrů v pořadí: RDI, RSI, RDX, RCX, R8, R9. Pokud má podprogram více než šest parametrů, vložte zbytek do zásobníku v opačném pořadí (tj. poslední parametr jako první). Vzhledem k tomu, že zásobník roste, je první z nadbytečných parametrů (ve skutečnosti sedmý parametr) uložen na nejnižší adrese (tato inverze parametrů byla historicky používána k tomu, aby bylo možné předávat funkce (podprogramy) s proměnným počtem parametrů).

3. Pro vyvolání podprogramu (procedury) použijte instrukci volání. Tato instrukce umístí návratovou adresu nad parametry na zásobníku (nejnižší pozice) a větve do kódu podprogramu.

4. Poté, co se podprogram vrátí (tj. bezprostředně po instrukci volání), musí volající odstranit všechny další parametry (kromě šesti, které jsou uloženy v registrech) ze zásobníku. Tím se zásobník obnoví do stavu před provedením volání.

5. Volající může očekávat, že v registru RAX najde návratovou hodnotu (adresu) podprogramu.

6. Volající obnoví obsah registrů uložených volajícím (R10, R11 a všechny registry předávání parametrů) jejich vyjmutím ze zásobníku. Volající může předpokládat, že žádné další registry nebyly změněny podprogramem.

Vzhledem ke způsobu, jakým je konvence volání strukturována, se obvykle stává, že některé (nebo většina) těchto kroků neprovede žádné změny v zásobníku. Pokud je například šest nebo méně parametrů, do zásobníku se v tomto kroku nic neposune. Podobně programátoři (a kompilátoři) obvykle v krocích 1 a 6 ponechávají výsledky, o které se zajímají, mimo registrů uložených volajícím, aby zabránili nadměrnému tlačí a vyskakování.

Existují dva další způsoby předání parametrů podprogramu, ale těmi se tento online kariérní kurz nebude zabývat. Jeden z nich používá samotný zásobník namísto obecných registrů.

Pravidla Callee

Definice volaného podprogramu by se měla řídit následujícími pravidly:

1. Přidělte lokální proměnné (proměnné, které jsou vyvíjeny v rámci procedury) pomocí registrů nebo vytvořením místa na zásobníku. Připomeňme, že zásobník roste směrem dolů. Takže, aby bylo místo v horní části zásobníku, měl by být ukazatel zásobníku zmenšen. Částka, o kterou je ukazatel zásobníku dekrementován, závisí na potřebném počtu lokálních proměnných. Pokud jsou například vyžadovány místní float a local long (celkem 12 bajtů), je třeba ukazatel zásobníku snížit o 12, aby se vytvořil prostor pro tyto lokální proměnné. V jazyce vyšší úrovně, jako je C, to znamená deklarovat proměnné bez přiřazení (inicializace) hodnot.

2. Dále musí být uloženy hodnoty všech registrů, které jsou určeny pro uložení volaného (všeobecné registry neuložené volajícím), které funkce používá. Chcete-li registry uložit, zatlačte je na zásobník. Registry uložené pro volajícího jsou RBX, RBP a R12 až R15 (RSP je také zachováno podle konvence volání, ale nemusí být během tohoto kroku posouváno do zásobníku).

Po provedení těchto tří akcí může vlastní operace podprogramu pokračovat. Když je podprogram připraven k návratu, pravidla konvence volání pokračují.

3. Po dokončení podprogramu by měla být návratová hodnota podprogramu umístěna do RAX, pokud tam již není.

4. Podprogram musí obnovit staré hodnoty všech registrů uložených volaným (RBX, RBP a R12 až R15), které byly změněny. Obsah registru se obnoví jeho vyjmutím ze zásobníku. Všimněte si, že registry by měly být vyskakovány v obráceném pořadí, v jakém byly tlačeny.

5. Dále provedeme přidělení lokálních proměnných. Nejjednodušší způsob, jak toho dosáhnout, je přidat k RSP stejnou částku, která byla od ní odečtena v kroku 1.

6. Nakonec se vrátíme k volajícímu provedením instrukce ret. Tato instrukce najde a odstraní příslušnou návratovou adresu ze zásobníku.

Příklad těla podprogramu volajícího pro volání jiného podprogramu, který je „myFunc“, je následující (přečtěte si komentáře):

; Chcete zavolat funkci „myFunc“, která trvá tři
; celočíselný parametr. První parametr je v RAX .
; Druhý parametr je konstanta 456. Třetí
; parametr je v paměti 'variabl'

tlačit rdi ; rdi bude param , tak to ulož
; long retVal = myFunc ( x , 456 , z ) ;

mov rdi , rax ; vložte první parametr do RDI
mov rsi, 456 ; vložte druhý parametr do RSI
mov rdx , [variabl] ; vložte třetí parametr do RDX

zavolejte myFunc ; zavolejte funkci

pop rdi ; obnovit uloženou hodnotu RDI
; návratová hodnota myFunc je nyní k dispozici v RAX

Příkladem funkce volaného (myFunc) je (přečtěte si komentáře):

myFunc:
; ∗∗∗ Standardní prolog podprogramu ∗∗∗
sub rsp, 8; místo pro 64bitovou lokální proměnnou (výsledek) pomocí „sub“ operačního kódu

push rbx; uložit volané-uložit registry
push rbp; oba bude používat myFunc

; ∗∗∗ Subrutina Body ∗∗∗
mov rax , rdi ; parametr 1 do RAX
mov rbp, rsi; parametr 2 na RBP
mov rbx, rdx; parametr 3 až rb x
mov [ rsp + 1 6 ] , rbx ; vložte rbx do lokální proměnné
přidat [ rsp + 1 6 ] , rbp ; přidat rbp do lokální proměnné
mov rax , [ rsp +16 ] ; mov obsah lokální proměnné do RAX
; (návratná hodnota/konečný výsledek)

; ∗∗∗ Standardní podprogram epilog ∗∗∗
pop rbp; obnovit registry uložení volaného
pop rbx; obráceně než při stlačení
přidat rsp, 8; uvolnit lokální proměnné. 8 znamená 8 bajtů
ret ; vyskočte nejvyšší hodnotu ze zásobníku, skočte tam

6.39 Přerušení a výjimky pro x64

Procesor poskytuje dva mechanismy pro přerušení provádění programu, přerušení a výjimky:

  • Přerušení je asynchronní (může nastat kdykoli) událost, která je obvykle spuštěna I/O zařízením.
  • Výjimkou je synchronní událost (dochází při provádění kódu, předprogramování, na základě nějakého výskytu), která je generována, když procesor detekuje jednu nebo více předdefinovaných podmínek při provádění instrukce. Jsou specifikovány tři třídy výjimek: poruchy, pasti a přerušení.

Procesor reaguje na přerušení a výjimky v podstatě stejně. Když je signalizováno přerušení nebo výjimka, procesor zastaví provádění aktuálního programu nebo úlohy a přepne na proceduru handleru, která je napsána speciálně pro zpracování podmínky přerušení nebo výjimky. Procesor přistupuje k proceduře obslužné rutiny prostřednictvím záznamu v tabulce deskriptorů přerušení (IDT). Když obsluha dokončí zpracování přerušení nebo výjimky, řízení programu se vrátí přerušenému programu nebo úloze.

Operační systém, výkonné ovladače a/nebo ovladače zařízení normálně zpracovávají přerušení a výjimky nezávisle na aplikačních programech nebo úlohách. Aplikační programy však mohou přistupovat k obslužným rutinám přerušení a výjimek, které jsou začleněny do operačního systému nebo jej vykonávají prostřednictvím volání v jazyce sestavení.

Je definováno osmnáct (18) předdefinovaných přerušení a výjimek, které jsou spojeny se záznamy v IDT. Lze také vytvořit a přiřadit k tabulce dvě stě dvacet čtyři (224) uživatelem definovaných přerušení. Každé přerušení a výjimka v IDT je ​​označena číslem, které se nazývá „vektor“. Tabulka 6.39.1 uvádí přerušení a výjimky se záznamy v IDT a jejich příslušné vektory. Vektory 0 až 8, 10 až 14 a 16 až 19 jsou předdefinovaná přerušení a výjimky. Vektory 32 až 255 jsou pro softwarově definovaná přerušení (uživatelská), která jsou buď pro softwarová přerušení, nebo pro maskovatelná hardwarová přerušení.

Když procesor zjistí přerušení nebo výjimku, provede jednu z následujících věcí:

  • Proveďte implicitní volání procedury handleru
  • Proveďte implicitní volání úlohy handleru

6.4 Základy 64bitové počítačové architektury ARM

Architektury ARM definují rodinu RISC procesorů, které jsou vhodné pro použití v široké škále aplikací. ARM je architektura načítání/ukládání, která vyžaduje načtení dat z paměti do registru před tím, než s ní může proběhnout jakékoli zpracování, jako je operace ALU (Arithmetic Logic Unit). Následující instrukce uloží výsledek zpět do paměti. I když se to může zdát jako krok zpět od architektur x86 a x64, které operují přímo s operandy v paměti v jediné instrukci (samozřejmě pomocí registrů procesoru), přístup načítání/ukládání v praxi umožňuje několik sekvenčních operací. být proveden vysokou rychlostí na operandu, jakmile je načten do jednoho z mnoha registrů procesoru. Procesory ARM mají možnost little endianness nebo big-endianness. Výchozí nastavení ARM 64 je little-endian, což je konfigurace, kterou běžně používají operační systémy. 64bitová architektura ARM je moderní a má nahradit 32bitovou architekturu ARM.

Poznámka : Každá instrukce pro 64bitový ARM µP je dlouhá 4 bajty (32 bitů).

6.41 Sada 64bitových registrů ARM
Existuje 31 obecných účelů 64bitových registrů pro 64bitový ARM µP. Následující diagram ukazuje univerzální registry a některé důležité registry:


Obr.4.11.1 64-Bit General Purpose a některé důležité registry

Univerzální registry jsou označovány jako X0 až X30. První 32bitová část pro každý registr se označuje jako W0 až W30. Pokud není zdůrazněn rozdíl mezi 32 bity a 64 bity, použije se předpona „R“. Například R14 odkazuje na W14 nebo X14.

6502 µP má 16bitový programový čítač a může adresovat 2 16 místa bajtů paměti. 64bitový ARM µP má 64bitový programový čítač a může adresovat až 2 64 = 1,844674407 x 1019 (ve skutečnosti 18 446 744 073 709 551 616) bajtů paměti. Programový čítač obsahuje adresu další instrukce, která má být provedena. Délka instrukce ARM64 nebo AArch64 je typicky čtyři bajty. Procesor automaticky zvýší tento registr o čtyři po načtení každé instrukce z paměti.

Registr Stack Pointer neboli SP není mezi 31 obecnými registry. Ukazatel zásobníku jakékoli architektury ukazuje na poslední položku zásobníku v paměti. U ARM-64 zásobník roste směrem dolů.

6502 µP má 8bitový stavový registr procesoru. Ekvivalent v ARM64 se nazývá registr PSTATE. Tento registr uchovává příznaky, které se používají pro výsledky operací a pro řízení procesoru (µP). Je široký 32 bitů. Následující tabulka uvádí názvy, index a významy běžně používaných bitů v registru PSTATE:

Tabulka 6.41.1
Nejpoužívanější příznaky PSTATE (bity)
Symbol Bit Účel
M 0-3 Režim: Aktuální úroveň oprávnění k provádění (USR, SVC atd.).
T 4 Thumb: Nastavuje se, pokud je aktivní sada instrukcí T32 (Thumb). Pokud není zaškrtnuto, instrukční sada ARM je aktivní. Uživatelský kód může tento bit nastavit a vymazat.
A 9 Endianness: Nastavení tohoto bitu aktivuje režim big-endian. Je-li jasné, je aktivní režim little-endian. Výchozí je režim little-endian.
Q 27 Kumulativní příznak saturace: Nastavuje se, pokud v určitém bodě série operací dojde k přetečení nebo saturaci
V 28 Příznak přetečení: Nastavuje se, pokud operace vedla k podepsanému přetečení.
C 29 Příznak přenosu: Označuje, zda sčítání způsobilo přenos nebo odečítání způsobilo vypůjčení.
S 30 Příznak nuly: Je nastaven, pokud je výsledek operace nula.
N 31 Negativní příznak: Je nastaven, pokud je výsledek operace negativní.

ARM-64 µP má mnoho dalších registrů.

SIMD
SIMD znamená Single Instruction, Multiple Data. To znamená, že jedna instrukce v assembleru může působit na více dat současně v jednom mikroprocesoru. Existuje třicet dva registrů o šířce 128 bitů pro použití se SIMD a operacemi s pohyblivou řádovou čárkou.

6.42 Mapování paměti
RAM i DRAM jsou paměti s náhodným přístupem. DRAM pracuje pomaleji než RAM. DRAM je levnější než RAM. Pokud je v paměti více než 32 gigabajtů (GB) pokračující paměti DRAM, bude docházet k větším problémům se správou paměti: 32 GB = 32 x 1024 x 1024 x 1024 bajtů. Pro celý paměťový prostor, který je mnohem větší než 32 GB, by měla být DRAM nad 32 GB proložena RAM pro lepší správu paměti. Abyste porozuměli mapě paměti ARM-64, měli byste nejprve porozumět mapě paměti 4 GB pro 32bitovou centrální procesorovou jednotku (CPU) ARM. CPU znamená µP. U 32bitového počítače je maximální adresovatelný prostor paměti 2 32 = 4 x 2 10 x 2 10 x 2 10 = 4 x 1024 x 1024 x 1024 = 4 294 967 296 = 4 GB.

32bitová mapa paměti ARM
Mapa paměti pro 32bitový ARM je:

U 32bitového počítače je maximální velikost celé paměti 4GB. Od adresy 0 GB do adresy 1 GB jsou umístění operačního systému ROM, RAM a I/O. Celá myšlenka ROM OS, RAM a I/O adres je podobná situaci Commodore-64 s možným 6502 CPU. OS ROM pro Commodore-64 je na horním konci paměťového prostoru. Operační systém ROM je zde mnohem větší než u Commodore-64 a je na začátku celého adresového prostoru paměti. Ve srovnání s jinými moderními počítači je operační systém ROM kompletní v tom smyslu, že je srovnatelný s množstvím OS na jejich pevných discích. Existují dva hlavní důvody, proč mít OS v integrovaných obvodech ROM: 1) CPU ARM se většinou používají v malých zařízeních, jako jsou smartphony. Mnoho pevných disků je větších než chytré telefony a další malá zařízení, 2) kvůli bezpečnosti. Když je operační systém v paměti pouze pro čtení, nemůže být poškozen (části přepsány) hackery. Sekce RAM a vstupně/výstupní sekce jsou také velmi velké ve srovnání s Commodore-64.

Když je napájení zapnuto s 32bitovým operačním systémem ROM, operační systém musí začínat (zavádět z) na adrese 0x00000000 nebo na adrese 0xFFFF0000, pokud je povoleno HiVEC. Když se tedy po fázi resetu zapne napájení, hardware CPU načte 0x00000000 nebo 0xFFFF0000 do počítadla programů. Předpona „0x“ znamená Hexadecimální. Zaváděcí adresa 64bitových CPU ARMv8 je definovaná implementace. Autor však radí počítačovému inženýrovi, aby kvůli zpětné kompatibilitě začínal na 0x00000000 nebo 0xFFFF0000.

Od 1 GB do 2 GB je mapovaný vstup/výstup. Je rozdíl mezi namapovaným I/O a pouze I/O, které se nacházejí mezi 0 GB a 1 GB. U I/O je adresa pro každý port pevná jako u Commodore-64. S mapovaným I/O nemusí být adresa každého portu nutně stejná pro každou operaci počítače (dynamická).

Od 2 GB do 4 GB je DRAM. Toto je očekávaná (nebo obvyklá) RAM. DRAM je zkratka pro Dynamic RAM, nejde o smysl měnící se adresy během provozu počítače, ale v tom smyslu, že hodnota každé buňky ve fyzické paměti RAM se musí obnovovat při každém hodinovém impulsu.

Poznámka :

  • Od 0x0000,0000 do 0x0000, FFFF je OS ROM.
  • Od 0x0001,0000 do 0x3FFF,FFFF může být více ROM, pak RAM a pak nějaké I/O.
  • Od 0x4000,0000 do 0x7FFF,FFFF jsou povoleny další I/O a/nebo mapované I/O.
  • Od 0x8000,0000 do 0xFFFF, FFFF je očekávaná DRAM.

To znamená, že očekávaná DRAM nemusí v praxi začínat na hranici 2 GB paměti. Proč by měl programátor respektovat ideální hranice, když na základní desce není dostatek fyzických RAM bank? Je to proto, že zákazník nemá dostatek peněz pro všechny banky RAM.

36bitová mapa paměti ARM
U 64bitového počítače ARM se všech 32 bitů používá k adresování celé paměti. U 64bitového počítače ARM lze prvních 36 bitů použít k adresování celé paměti, což jsou v tomto případě 2 36 = 68 719 476 736 = 64 GB. To už je hodně paměti. Běžné počítače dnes takové množství paměti nepotřebují. To ještě nedosahuje maximálního rozsahu paměti, ke které lze přistupovat pomocí 64 bitů. Mapa paměti pro 36bitový procesor ARM je:

Od adresy 0 GB po adresu 4 GB je 32bitová mapa paměti. „Rezervováno“ znamená, že se nepoužívá a je uchováno pro budoucí použití. Nemusí to být fyzické paměťové banky, které jsou umístěny na základní desce pro tento prostor. Zde mají DRAM a mapované I/O stejný význam jako pro 32bitovou paměťovou mapu.

V praxi se můžeme setkat s následující situací:

  • 0x1 0000 0000 – 0x3 FFFF FFFF; Rezervováno. 12 GB adresního prostoru je vyhrazeno pro budoucí použití.
  • 0x4 0000 0000 – 0x7 FFFF FFFF; mapované I/O. Pro dynamicky mapované I/O je k dispozici 16 GB adresního prostoru.
  • 0x8 0000 0000 – 0x8 7FFF FFFF FFFF; Díra nebo DRAM. 2 GB adresního prostoru může obsahovat jedno z následujících:
    • Otvor pro umožnění rozdělení zařízení DRAM na oddíly (jak je popsáno v následující diskusi).
    • DOUŠEK.
  • 0x8 8000 0000 – 0xF FFFF FFFF; DOUŠEK. 30 GB adresního prostoru pro DRAM.

Tato mapa paměti je nadmnožinou 32bitové mapy adres, přičemž další prostor je rozdělen jako 50 % DRAM (1/2) s volitelným otvorem v něm a 25 % mapovaného I/O prostoru a rezervovaného prostoru (1/4 ). Zbývajících 25 % (1/4) je pro 32bitovou paměťovou mapu ½ + ¼ + ¼ = 1.

Poznámka : Od 32 bitů do 360 bitů je přidání 4 bitů k nejvýznamnější straně 36 bitů.

40bitová mapa paměti
Mapa 40bitových adres je nadmnožinou 36bitové mapy adres a sleduje stejný vzor 50 % DRAM s volitelnou dírou v ní, 25 % mapovaného I/O prostoru a rezervovaného prostoru a zbývajících 25 % místo pro předchozí paměťovou mapu (36bitová). Diagram pro paměťovou mapu je:

Velikost otvoru je 544 – 512 = 32GB. V praxi se můžeme setkat s následující situací:

  • 0x10 0000 0000 – 0x3F FFFF FFFF; Rezervováno. 192 GB adresního prostoru je vyhrazeno pro budoucí použití.
  • 0x40 0000 0000 – 0x7F FFFF FFFF; zmapováno. I/O Pro dynamicky mapované I/O je k dispozici 256 GB adresního prostoru.
  • 0x80 0000 0000 – 0x87 FFFF FFFF; díra nebo DRAM. 32 GB adresního prostoru může obsahovat jedno z následujících:
    • Otvor pro povolení rozdělení zařízení DRAM na oddíly (jak je popsáno v následující diskusi)
    • DOUŠEK
  • 0x88 0000 0000 – 0xFF FFFF FFFF; DOUŠEK. 480 GB adresního prostoru pro DRAM.

Poznámka : Od 36 bitů do 40 bitů je přidání 4 bitů k nejvýznamnější straně 36 bitů.

DRAM DÍRA
Na mapě paměti nad 32 bitů se jedná buď o DRAM Hole, nebo o pokračování DRAM shora. Pokud se jedná o díru, je třeba to ocenit následovně: Díra DRAM poskytuje způsob, jak rozdělit velké zařízení DRAM do více rozsahů adres. Volitelný otvor DRAM je navržen na začátku vyšší hranice adresy DRAM. To umožňuje zjednodušené schéma dekódování při rozdělování velkokapacitního zařízení DRAM přes nižší fyzicky adresovanou oblast.

Například část 64GB DRAM je rozdělena do tří oblastí s offsety adres provedenými jednoduchým odečtením bitů adresy vyššího řádu takto:

Tabulka 6.42.1
Příklad 64GB DRAM rozdělení s otvory
Fyzické adresy v SoC Offset Interní adresa DRAM
2 GB (32bitová mapa) 0x00 8000 0000 – 0x00 FFFF FFFF -0x00 8000 0000 0x00 0000 0000 – 0x00 7FFF FFFF
30 GB (36bitová mapa) 0x08 8000 0000 – 0x0F FFFF FFFF -0x08 0000 0000 0x00 8000 0000 – 0x07 FFFF FFFF
32 GB (40bitová mapa) 0x88 0000 0000 – 0x8F FFFF FFFF -0x80 000 0000 0x08 0000 0000 – 0x0F FFFF FFFF

Navrhované 44bitové a 48bitové mapy adresované paměti pro procesory ARM
Předpokládejme, že osobní počítač má 1024 GB (= 1 TB) paměti; to je příliš mnoho paměti. A tak 44bitové a 48bitové adresované paměťové mapy pro CPU ARM pro 16 TB a 256 TB jsou pouze návrhy pro budoucí potřeby počítačů. Ve skutečnosti tyto návrhy pro CPU ARM sledují stejné rozdělení paměti podle poměru jako předchozí mapy paměti. To znamená: 50 % DRAM s volitelným otvorem v ní, 25 % mapovaného I/O prostoru a rezervovaného prostoru a zbytek 25 % prostoru pro předchozí mapu paměti.

52-bitové, 56-bitové, 60-bitové a 64-bitové adresované paměťové mapy budou pro ARM 64 bity stále navrženy pro vzdálenou budoucnost. Pokud vědci v té době stále považují rozdělení celého paměťového prostoru 50 : 25 : 25 za užitečné, poměr zachovají.

Poznámka : SoC znamená System-on-Chip, což znamená obvody v čipu µP, které by tam jinak nebyly.

SRAM nebo Static Random Access Memory je rychlejší než tradičnější DRAM, ale vyžaduje větší plochu křemíku. SRAM nevyžaduje obnovení. RAM si čtenář může představit jako SRAM.

6.43 Režimy adresování v assembleru pro ARM 64
ARM je architektura načítání/ukládání, která vyžaduje načtení dat z paměti do registru procesoru předtím, než s ní může proběhnout jakékoli zpracování, jako je aritmetická logická operace. Následující instrukce uloží výsledek zpět do paměti. I když se to může zdát jako krok zpět od x86 a jejích následných architektur x64, které operují přímo s operandy v paměti v jediné instrukci, v praxi přístup načítání/ukládání umožňuje provádět několik sekvenčních operací vysokou rychlostí na operand, jakmile je načten do jednoho z mnoha registrů procesoru.

Formát assembleru ARM má podobnosti a rozdíly s řadou x64 (x86).

  • Offset : Do základního registru lze přidat konstantu se znaménkem. Offset se zadává jako součást instrukce. Například: ldr x0, [rx, #10] načte r0 se slovem na adrese r1+10.
  • Registrovat : Inkrement bez znaménka, který je uložen v registru, lze přidat nebo odečíst od hodnoty v základním registru. Například: ldr r0, [x1, x2] načte r0 se slovem na adrese x1+x2. Každý z registrů lze považovat za základní registr.
  • Škálovaný registr : Přírůstek v registru je posunut doleva nebo doprava o zadaný počet bitových pozic před přičtením nebo odečtením od základní hodnoty registru. Například: ldr x0, [x1, x2, lsl #3] načte r0 se slovem na adrese r1+(r2×8). Posun může být logický posun doleva nebo doprava (lsl nebo lsr), který vkládá nulové bity do uvolněných bitových pozic, nebo aritmetický posun doprava (asr), který replikuje znaménkový bit na uvolněné pozice.

Jsou-li zahrnuty dva operandy, cíl je před (vlevo) zdrojem (existují výjimky). Operační kódy pro jazyk assembleru ARM nerozlišují malá a velká písmena.

Okamžitý režim adresování ARM64
Příklad:

mov r0, #0xFF000000 ; Načtěte 32bitovou hodnotu FF000000h do r0

Desetinná hodnota je bez 0x, ale stále před ní je #.

Zaregistrujte se přímo
Příklad:

mov x0, x1; Zkopírujte x1 do x0

Registrovat nepřímé
Příklad:

str x0, [x3] ; Uložte x0 na adresu v x3

Registrovat nepřímé s posunem
Příklady:

ldr x0, [x1, #32] ; Načtěte r0 hodnotou na adrese [r1+32]; r1 je základní registr
str x0, [x1, #4] ; Uložte r0 na adresu [r1+4]; r1 je základní registr; čísla jsou základ 10

Registrovat nepřímé s posunem (předběžně zvýšeno)
Příklady:

ldr x0, [x1, #32]! ; Načtěte r0 pomocí [r1+32] a aktualizujte r1 na (r1+32)
str x0, [x1, #4]! ; Uložte r0 na [r1+4] a aktualizujte r1 na (r1+4)

Všimněte si použití „!“ symbol.

Registrovat nepřímé s posunem (po navýšení)
Příklady:

ldr x0, [x1], #32 ; Načíst [x1] na x0, poté aktualizovat x1 na (x1+32)
str x0, [x1], #4 ; Uložte x0 na [x1] a poté aktualizujte x1 na (x1+4)

Dvojitý registr nepřímý
Adresa operandu je součtem základního registru a přírůstkového registru. Jména rejstříku jsou ohraničena hranatými závorkami.
Příklady:

ldr x0, [x1, x2]; Načíst x0 pomocí [x1+x2]
str x0, [rx, x2]; Uložit x0 až [x1+x2]

Režim relativního adresování
V režimu relativního adresování je efektivní instrukce další instrukce v čítači programů plus index. Index může být kladný nebo záporný.
Příklad:

ldr x0, [pc, #24]

To znamená registr zatížení X0 se slovem, na které ukazuje obsah PC plus 24.

6.44 Některé běžně používané pokyny pro ARM 64
Zde jsou běžně používané pokyny:

6.45 Opakování

Ilustrace
Následující kód neustále přidává hodnotu v registru X10 k hodnotě v X9, dokud není hodnota v X8 nula. Předpokládejme, že všechny hodnoty jsou celá čísla. Hodnota v X8 se v každé iteraci odečte o 1:

smyčka:
CBZ X8, přeskočit
PŘIDAT X9, X9, X10; první X9 je cíl a druhý X9 je zdroj
SUB X8, X8, #1; první X8 je cíl a druhý X8 je zdroj
B smyčka
přeskočit:

Stejně jako u 6502 µP a X64 µP začíná označení v ARM 64 µP na začátku řádku. Zbytek instrukcí začíná na některých mezerách za začátkem řádku. U x64 a ARM 64 následuje za štítkem dvojtečka a nový řádek. Zatímco u 6502 následuje za štítkem instrukce za mezerou. V předchozím kódu první instrukce, která je „CBZ X8, skip“, znamená, že pokud je hodnota v X8 nula, pokračujte na štítku „skip:“, přeskočte instrukce mezi tím a pokračujte zbývajícími instrukcemi níže. 'přeskočit:'. „Smyčka B“ je bezpodmínečný skok na štítek „smyčka“. Místo „smyčky“ lze použít jakýkoli jiný název štítku.

Takže, stejně jako u 6502 µP, použijte instrukce větve, abyste měli smyčku s ARM 64.

6.46 ARM 64 Vstup/Výstup
Všechny periferie ARM (interní porty) jsou mapovány do paměti. To znamená, že programovací rozhraní je sada paměťově adresovaných registrů (vnitřních portů). Adresa takového registru je offsetem od konkrétní adresy paměti. Je to podobné tomu, jak 6502 dělá vstup/výstup. ARM nemá možnost samostatného I/O adresního prostoru.

6.47 Zásobník ARM 64
ARM 64 má zásobník v paměti (RAM) podobným způsobem jako 6502 a x64. U ARM64 však neexistuje žádný operační kód push nebo pop. Zásobník v ARM 64 také roste směrem dolů. Adresa v ukazateli zásobníku ukazuje těsně za poslední bajt poslední hodnoty, která je umístěna v zásobníku.

Důvod, proč pro ARM64 neexistuje žádný obecný pop nebo push operační kód, je ten, že ARM 64 spravuje svůj zásobník ve skupinách po sobě jdoucích 16 bajtů. Hodnoty však existují ve skupinách bajtů po jednom bajtu, dvou bajtech, čtyřech bajtech a 8 bajtech. Takže jedna hodnota může být umístěna do zásobníku a zbývající místa (umístění bajtů), která tvoří 16 bajtů, jsou vyplněna fiktivními bajty. To má nevýhodu v plýtvání pamětí. Lepším řešením je zaplnit 16bajtové umístění menšími hodnotami a nechat si od programátora napsat kód, který sleduje, odkud hodnoty v 16bajtovém umístění pocházejí (registruje). Tento extra kód je také potřeba při stahování hodnot. Alternativou k tomu je naplnění dvou 8bajtových obecných registrů různými hodnotami a poté odeslání obsahu dvou 8bajtových registrů do zásobníku. Zde je stále potřeba zvláštní kód pro sledování specifických malých hodnot, které jdou do zásobníku a opouštějí zásobník.

Následující kód ukládá čtyři 4bajtová data do zásobníku:

str w0, [sp, #-4]!
str w1, [sp, #-8]!
str w2, [sp, #-12]!
str w3, [sp, #-16]!

První čtyři bajty (w) registrů – x0, x1, x2 a x3 – jsou odeslány do 16 po sobě jdoucích bajtových umístění v zásobníku. Všimněte si použití „str“ a nikoli „push“. Všimněte si symbolu vykřičníku na konci každé instrukce. Protože zásobník paměti roste směrem dolů, první čtyřbajtová hodnota začíná na pozici, která je mínus čtyři bajty pod předchozí pozicí ukazatele zásobníku. Zbytek čtyřbajtových hodnot následuje, jdou dolů. Následující segment kódu provede správný (a v pořádku) ekvivalent k zobrazení čtyř bajtů:

ldr w3, [sp], #0
ldr w2, [sp], #4
ldr w1, [sp], #8
ldr w0, [sp], #12

Všimněte si použití ldr opcode místo pop. Všimněte si také, že zde není použit symbol vykřičníku.

Všechny bajty v X0 (8 bajtů) a X1 (8 bajtů) lze odeslat do 16bajtového umístění v zásobníku následovně:

stp x0, x1, [sp, #-16]! ; 8 + 8 = 16

V tomto případě nejsou nutné registry x2 (w2) a x3 (w3). Všechny hledané bajty jsou v registrech X0 a X2. Poznamenejte si operační kód stp pro ukládání dvojic obsahu registru do paměti RAM. Všimněte si také symbolu vykřičníku. Popový ekvivalent je:

ldp x0, x1, [sp], #0

Tento pokyn neobsahuje žádný vykřičník. Poznamenejte si operační kód LDP místo LDR pro načítání dvou po sobě jdoucích datových míst z paměti do dvou registrů µP. Pamatujte také, že kopírování z paměti do registru µP se načítá, nezaměňujte s načítáním souboru z disku do RAM a kopírování z registru µP do RAM je ukládání.

6.48 Podprogram
Podprogram je blok kódu, který provádí úlohu, volitelně na základě některých argumentů a volitelně vrací výsledek. Podle konvence se registry R0 až R3 (čtyři registry) používají k předání argumentů (parametrů) podprogramu a R0 se používá k předání výsledku zpět volajícímu. Podprogram, který potřebuje více než 4 vstupy, používá zásobník pro další vstupy. Chcete-li zavolat podprogram, použijte odkaz nebo instrukci podmíněného větvení. Syntaxe instrukce odkazu je:

štítek BL

Kde BL je operační kód a návěští představuje začátek (adresu) podprogramu. Tato větev je bezpodmínečná, vpřed nebo vzad do 128 MB. Syntaxe instrukce podmíněného větvení je:

B.cond štítek

Kde cond je podmínka, např. eq (rovná se) nebo ne (není se rovná). Následující program má podprogram doadd, který přidává hodnoty dvou argumentů a vrací výsledek v R0:

AREA subrout, CODE, READONLY ; Pojmenujte tento blok kódu
VSTUP ; Označte první pokyn k provedení
start MOV r0, #10 ; Nastavte parametry
MOV r1, #3
BL doadd ; Volání podprogramu
stop MOV r0, #0x18 ; angel_SWIreason_ReportException
LDR r1, =0x20026; ADP_Stopped_ApplicationExit
SVC #0x123456 ; ARM semihosting (dříve SWI)
doadd ADD r0, r0, r1 ; Kód podprogramu
BX lr; Návrat z podprogramu
;
KONEC ; Označte konec souboru

Čísla, která se mají přidat, jsou desetinná 10 a desetinná 3. První dva řádky v tomto bloku kódu (programu) budou vysvětleny později. Další tři řádky posílají 10 do registru R0 a 3 do registru R1 a také zavolají podprogram doadd. „doadd“ je štítek, který obsahuje adresu začátku podprogramu.

Podprogram se skládá pouze ze dvou řádků. První řádek přidá obsah 3 R k obsahu 10 R0, což umožňuje výsledek 13 v R0. Druhý řádek s operačním kódem BX a operandem LR se vrací z podprogramu do kódu volajícího.

ŽE JO
Operační kód RET v ARM 64 se stále zabývá podprogramem, ale funguje jinak než RTS v 6502 nebo RET na x64 nebo kombinace „BX LR“ v ARM 64. V ARM 64 je syntaxe RET:

ROVNĚ {Xn}

Tato instrukce dává programu příležitost pokračovat s podprogramem, který není volajícím podprogramem, nebo jen pokračovat s nějakou jinou instrukcí a jejím následujícím segmentem kódu. Xn je univerzální registr, který obsahuje adresu, na kterou má program pokračovat. Tato instrukce se větví bezpodmínečně. Pokud není zadáno Xn, použije se výchozí obsah X30.

Standardní volání procedury
Pokud programátor chce, aby jeho kód interagoval s kódem napsaným někým jiným nebo s kódem vytvořeným kompilátorem, musí se programátor dohodnout s osobou nebo autorem kompilátoru na pravidlech pro použití registru. Pro architekturu ARM se tato pravidla nazývají Standard volání procedur nebo PCS. Jedná se o dohody mezi dvěma nebo třemi stranami. PCS specifikuje následující:

  • Které registry µP se používají k předání argumentů do funkce (podprogramu)
  • Které µP registry se používají k vrácení výsledku funkci, která provádí volání, která je známá jako volající
  • Který µP registruje funkci, která je volána, která je známá jako volaný, může dojít k poškození
  • Které µP registruje volaného, ​​nemůže se poškodit

6.49 Přerušení
Pro procesor ARM jsou k dispozici dva typy obvodů řadiče přerušení:

  • Standardní řadič přerušení: Obslužná rutina přerušení určuje, které zařízení vyžaduje obsluhu, čtením bitmapového registru zařízení v řadiči přerušení.
  • Vector Interrupt Controller (VIC): Upřednostňuje přerušení a zjednodušuje určení, které zařízení přerušení způsobilo. Po přiřazení priority a adresy obslužné rutiny každému přerušení předá VIC procesoru signál přerušení pouze v případě, že priorita nového přerušení je vyšší než aktuálně prováděná obsluha přerušení.

Poznámka : Výjimka se týká chyby. Podrobnosti o řadiči vektorového přerušení pro 32bitový počítač ARM jsou následující (64bitový je podobný):

Tabulka 6.49.1
Výjimka/přerušení vektoru ARM pro 32bitový počítač
Výjimka/přerušení Krátká ruka Adresa Vysoká adresa
Resetovat RESETOVAT 0x00000000 0xffff0000
Nedefinovaný pokyn UNDEF 0x00000004 0xffff0004
Softwarové přerušení SWI 0x00000008 0xffff0008
Prefetch přerušit pabt 0x0000000C 0xffff000C
Datum potratu DABT 0x00000010 0xffff0010
Rezervováno 0x00000014 0xffff0014
Požadavek na přerušení IRQ 0x00000018 0xffff0018
Požadavek na rychlé přerušení FIQ 0x0000001C 0xffff001C

Toto vypadá jako uspořádání pro architekturu 6502 kde NMI , BR , a IRQ mohou mít ukazatele na stránce nula a odpovídající rutiny jsou vysoko v paměti (ROM OS). Stručný popis řádků předchozí tabulky je následující:

RESETOVAT
To se stane, když se procesor zapne. Inicializuje systém a nastavuje zásobníky pro různé režimy procesoru. Je to výjimka s nejvyšší prioritou. Po vstupu do obslužného programu resetu je CPSR v režimu SVC a bity IRQ i FIQ jsou nastaveny na 1, čímž se maskují všechna přerušení.

DATUM POTRATU
Druhá nejvyšší priorita. K tomu dochází, když se pokoušíme číst/zapisovat na neplatnou adresu nebo přistupujeme k nesprávnému přístupovému oprávnění. Po vstupu do Data Abort Handler budou IRQ deaktivována (I-bit set 1) a FIQ bude povoleno. IRQ jsou maskovaná, ale FIQ zůstávají nezamaskovaná.

FIQ
Přerušení s nejvyšší prioritou, IRQ a FIQ, jsou zakázány, dokud není FIQ zpracováno.

IRQ
Přerušení s vysokou prioritou, obslužná rutina IRQ, se zadává pouze v případě, že nedochází k průběžnému přerušení FIQ a dat.

Pre-Fetch Abort
Je to podobné jako přerušení dat, ale stane se to při selhání načtení adresy. Po vstupu do obslužné rutiny jsou IRQ zakázány, ale FIQ zůstávají povoleny a může k nim dojít během přerušení předběžného načtení.

SWI
Výjimka softwarového přerušení (SWI) nastane, když je provedena instrukce SWI a žádná z dalších výjimek s vyšší prioritou nebyla označena.

Nedefinovaný pokyn
Výjimka Undefined Instruction nastane, když instrukce, která není v instrukční sadě ARM nebo Thumb, dosáhne fáze provádění kanálu a žádná z dalších výjimek nebyla označena. Toto je stejná priorita jako SWI, jak se může stát najednou. To znamená, že instrukce, která je prováděna, nemůže být současně instrukce SWI a nedefinovaná instrukce.

ARM Zpracování výjimek
Když dojde k výjimce, dojde k následujícím událostem:

  • Uložte CPSR do SPSR režimu výjimky.
  • PC je uloženo v LR režimu výjimky.
  • Linkový registr je nastaven na konkrétní adresu na základě aktuální instrukce. Například: pro ISR, LR = poslední provedená instrukce + 8.
  • Aktualizujte CPSR o výjimce.
  • Nastavte PC na adresu obslužné rutiny výjimky.

6.5 Pokyny a údaje

Data se týkají proměnných (návěsky s jejich hodnotami) a polí a dalších struktur, které jsou podobné poli. Řetězec je jako pole znaků. Pole celých čísel je vidět v jedné z předchozích kapitol. Instrukce se týkají operačních kódů a jejich operandů. Program lze napsat s operačními kódy a daty smíchanými v jedné pokračující části paměti. Tento přístup má nevýhody, ale nedoporučuje se.

Nejprve by měl být napsán program s instrukcemi, následovanými daty (množné číslo data jsou data). Oddělení mezi instrukcemi a daty může být jen několik bajtů. U programu mohou být instrukce i data v jedné nebo dvou samostatných sekcích v paměti.

6.6 Harvardská architektura

Jeden z prvních počítačů se nazývá Harvard Mark I (1944). Přísná harvardská architektura používá jeden adresní prostor pro instrukce programu a jiný samostatný adresní prostor pro data. To znamená, že existují dvě samostatné paměti. Následující ukazuje architekturu:


Obrázek 6.71 Harvardská architektura

Řídicí jednotka provádí dekódování instrukce. Aritmetická logická jednotka (ALU) provádí aritmetické operace s kombinační logikou (hradla). ALU také provádí logické operace (např. řazení).

U mikroprocesoru 6502 jde instrukce nejprve do mikroprocesoru (řídicí jednotce) před tím, než datum (jednotné číslo pro data) jde do registru µP, než dojde k jejich interakci. To vyžaduje alespoň dva hodinové impulsy a nejedná se o současný přístup k instrukci a datu. Na druhé straně, Harvardská architektura poskytuje současný přístup k instrukcím a datům, přičemž instrukce i datum vstoupí do µP současně (operační kód do řídicí jednotky a datum do registru µP), čímž se ušetří alespoň jeden hodinový impuls. Toto je forma paralelismu. Tato forma paralelismu se používá v hardwarové mezipaměti moderních základních desek (viz následující diskuse).

6.7 Vyrovnávací paměť

Cache Memory (RAM) je oblast vysokorychlostní paměti (ve srovnání s rychlostí hlavní paměti), která dočasně ukládá programové instrukce nebo data pro budoucí použití. Vyrovnávací paměť pracuje rychleji než hlavní paměť. Obvykle jsou tyto instrukce nebo datové položky načteny z poslední hlavní paměti a pravděpodobně budou brzy znovu potřeba. Primárním účelem vyrovnávací paměti je zvýšit rychlost opakovaného přístupu ke stejným umístěním hlavní paměti. Aby byl přístup k položkám uloženým v mezipaměti efektivní, musí být výrazně rychlejší než přístup k původnímu zdroji pokynů nebo dat, který se nazývá Backing Store.

Když se používá ukládání do mezipaměti, každý pokus o přístup k umístění hlavní paměti začíná hledáním mezipaměti. Pokud je požadovaná položka přítomna, zpracovatel ji okamžitě vyhledá a použije. Toto se nazývá Cache Hit. Pokud je vyhledávání mezipaměti neúspěšné (chyba mezipaměti), musí být instrukce nebo datová položka načtena ze záložního úložiště (hlavní paměti). V procesu získávání požadované položky je kopie přidána do mezipaměti pro předpokládané použití v blízké budoucnosti.

Jednotka správy paměti
Jednotka správy paměti (MMU) je obvod, který spravuje hlavní paměť a související paměťové registry na základní desce. V minulosti se jednalo o samostatný integrovaný obvod na základní desce; ale dnes je typicky součástí mikroprocesoru. MMU by také měla spravovat cache (obvod), která je dnes také součástí mikroprocesoru. Obvod cache byl v minulosti samostatným integrovaným obvodem.

Statická RAM
Statická RAM (SRAM) má podstatně rychlejší přístupovou dobu než DRAM, i když na úkor podstatně složitějších obvodů. Bitové buňky SRAM zabírají mnohem více místa na matrici integrovaného obvodu než buňky zařízení DRAM, které je schopno uložit ekvivalentní množství dat. Hlavní paměť (RAM) se obvykle skládá z DRAM (Dynamic RAM).

Mezipaměť zlepšuje výkon počítače, protože mnoho algoritmů, které jsou prováděny operačními systémy a aplikacemi, vykazuje referenční lokalitu. Referenční lokalita se týká opětovného použití dat, ke kterým se nedávno přistupovalo. Toto je označováno jako dočasné místo. Na moderní základní desce je vyrovnávací paměť ve stejném integrovaném obvodu jako mikroprocesor. Hlavní paměť (DRAM) je daleko a je přístupná přes sběrnice. Referenční lokalita také odkazuje na prostorovou lokalitu. Prostorová lokalita souvisí s vyšší rychlostí přístupu k datům kvůli fyzické blízkosti.

Oblasti vyrovnávací paměti jsou zpravidla malé (v počtu bytových míst) ve srovnání se záložním úložištěm (hlavní pamětí). Mezipaměťová zařízení jsou navržena pro maximální rychlost, což obecně znamená, že jsou složitější a nákladnější na bit než technologie ukládání dat, která se používá v záložním úložišti. Vzhledem k jejich omezené velikosti mají mezipaměťová zařízení tendenci se rychle zaplňovat. Pokud mezipaměť nemá volné místo pro uložení nového záznamu, starší záznam musí být zahozen. Řadič mezipaměti používá zásadu výměny mezipaměti k výběru, který záznam mezipaměti bude přepsán novým záznamem.

Cílem mezipaměti mikroprocesoru je maximalizovat procento zásahů do mezipaměti v průběhu času, a tak zajistit nejvyšší trvalou rychlost provádění instrukcí. K dosažení tohoto cíle musí logika ukládání do mezipaměti určit, které instrukce a data budou umístěny do mezipaměti a uchovány pro blízké budoucí použití.

Logika ukládání do mezipaměti procesoru nezaručuje, že datová položka uložená v mezipaměti bude znovu použita, jakmile bude vložena do mezipaměti.

Logika ukládání do mezipaměti se opírá o pravděpodobnost, že vzhledem k časové (opakující se v čase) a prostorové (prostorové) lokalitě je velmi dobrá šance, že k datům uloženým v mezipaměti bude v blízké budoucnosti zpřístupněno. V praktických implementacích na moderních procesorech se přístupy do mezipaměti obvykle vyskytují u 95 až 97 procent přístupů do paměti. Vzhledem k tomu, že latence mezipaměti je malým zlomkem latence DRAM, vede vysoká rychlost vyrovnávací paměti k podstatnému zlepšení výkonu ve srovnání s konstrukcí bez vyrovnávací paměti.

Nějaká paralelnost s cache
Jak již bylo zmíněno, dobrý program v paměti má instrukce oddělené od dat. V některých systémech mezipaměti je obvod mezipaměti „vlevo“ od procesoru a další obvod mezipaměti „vpravo“ procesoru. Levá mezipaměť zpracovává instrukce programu (nebo aplikace) a pravá mezipaměť zpracovává data stejného programu (nebo stejné aplikace). To vede k lepšímu zvýšení rychlosti.

6.8 Procesy a vlákna

Počítače CISC i RISC mají procesy. V softwaru je proces. Program, který běží (probíhá) je proces. Operační systém je dodáván s vlastními programy. Když je počítač v provozu, běží také programy operačního systému, které umožňují práci počítače. Jedná se o procesy operačního systému. Uživatel nebo programátor může psát své vlastní programy. Když běží uživatelský program, je to proces. Nezáleží na tom, zda je program napsán v jazyce symbolických instrukcí nebo v jazyce vyšší úrovně, jako je C nebo C++. Všechny procesy (uživatel nebo OS) jsou řízeny jiným procesem, který se nazývá „plánovač“.

Vlákno je jako dílčí proces patřící k procesu. Proces se může spustit a rozdělit do vláken a pak stále pokračuje jako jeden proces. Proces bez vláken lze považovat za hlavní vlákno. Procesy a jejich vlákna jsou spravovány stejným plánovačem. Samotný plánovač je program, když je rezidentní na disku OS. Při běhu v paměti je plánovač proces.

6.9 Vícenásobné zpracování

Vlákna jsou spravována téměř jako procesy. Multiprocessing znamená spuštění více než jednoho procesu současně. Existují počítače pouze s jedním mikroprocesorem. Existují počítače s více než jedním mikroprocesorem. S jediným mikroprocesorem procesy a/nebo vlákna používají stejný mikroprocesor způsobem prokládání (nebo časového segmentování). To znamená, že proces využívá procesor a zastaví se bez dokončení. Jiný proces nebo vlákno používá procesor a zastaví se bez dokončení. Poté další proces nebo vlákno použije mikroprocesor a zastaví se bez dokončení. Toto pokračuje, dokud všechny procesy a vlákna zařazené do fronty plánovačem nebudou mít podíl na procesoru. Toto je označováno jako souběžné multiprocesování.

Pokud existuje více než jeden mikroprocesor, dochází k paralelnímu multiprocesoru, na rozdíl od souběžného zpracování. V tomto případě každý procesor spouští určitý proces nebo vlákno, které se liší od toho, co běží na druhém procesoru. Všechny procesory na stejné základní desce provozují své různé procesy a/nebo různá vlákna současně v paralelním multiprocesingu. Procesy a vlákna v paralelním multiprocesingu jsou stále spravovány plánovačem. Paralelní multiprocesing je rychlejší než souběžný multiprocessing.

V tuto chvíli se může čtenář divit, jak je paralelní zpracování rychlejší než souběžné zpracování. Je to proto, že procesory sdílejí (musí používat v různých časech) stejnou paměť a vstupní/výstupní porty. No a s využitím cache je celkový chod základní desky rychlejší.

6.10 Stránkování

Jednotka správy paměti (MMU) je obvod, který je blízko mikroprocesoru nebo v mikroprocesorovém čipu. Řeší mapu paměti nebo stránkování a další problémy s pamětí. Ani 6502 µP, ani počítač Commodore-64 nemají MMU per se (ačkoli v Commodore-64 stále existuje nějaká správa paměti). Commodore-64 zpracovává paměť stránkováním, kde každá stránka je 256 10 délka bajtů (100 16 dlouhé bajty). Nebylo pro něj povinné zacházet s pamětí stránkováním. Stále by to mohlo mít jen paměťovou mapu a pak programy, které se samy hodí do jejich různých určených oblastí. Stránkování je jedním ze způsobů, jak zajistit efektivní využití paměti, aniž byste měli mnoho paměťových sekcí, které nemohou mít data nebo program.

Počítačová architektura x86 386 byla vydána v roce 1985. Adresová sběrnice je široká 32 bitů. Takže celkem 2 32 = 4 294 967 296 adresního prostoru je možný. Tento adresní prostor je rozdělen na 1 048 576 stránek = 1 024 KB stránek. Při tomto počtu stránek se jedna stránka skládá ze 4 096 bajtů = 4 KB. Následující tabulka ukazuje stránky fyzických adres pro 32bitovou architekturu x86:

Tabulka 6.10.1
Fyzické adresovatelné stránky pro architekturu x86
Základ 16 adres Stránky Základ 10 adres
FFFFF000 – FFFFFFFF Strana 1,048,575 4 294 963 200 – 4 294 967 295
FFFFE000 – FFFFEFFF Strana 1,044,479 4 294 959 104 – 4 294 963 199
FFFFD000 – FFFFFFFF Strana 1,040,383 4 294 955 008 – 4 294 959 103
|
|
|
|
|
|
|
|
|
00002000 – 00002FFF strana 2 8 192 – 12 288
00001000 – 00001FFF Strana 1 4 096 – 8 191
00000000 – 00000FFF Strana 0 0 – 4 095

Aplikace se dnes skládá z více než jednoho programu. Jeden program může zabrat méně než jednu stránku (méně než 4096) nebo může zabrat dvě či více stránek. Aplikace tedy může trvat jednu nebo více stránek, přičemž každá stránka je dlouhá 4096 bajtů. Přihlášku mohou napsat různí lidé, přičemž každá osoba je přiřazena k jedné nebo více stránkám.

Všimněte si, že stránka 0 je od 00000000H do 00000FFF
stránka 1 je od 00001000H do 00001FFFH, stránka 2 je od 00002000 H – 00002FFF H , a tak dále. U 32bitového počítače jsou v procesoru dva 32bitové registry pro fyzické adresování stránek: jeden pro základní adresu a druhý pro adresu indexu. Chcete-li získat přístup k umístěním bajtů na stránce 2, například registr pro základní adresu by měl být 00002 H což je prvních 20 bitů (zleva) pro počáteční adresy stránky 2. Zbytek bitů v rozsahu 000 H do FFF H jsou v registru zvaném „indexový registr“. Takže všechny bajty na stránce jsou přístupné pouhým zvýšením obsahu v indexovém registru od 000 H do FFF H . Obsah v indexovém registru je přidán k obsahu, který se v základním registru nemění, aby se získala efektivní adresa. Toto schéma adresování indexu platí pro ostatní stránky.

Takto se však program v jazyce symbolických instrukcí nepíše pro každou stránku. Pro každou stránku programátor zapíše kód začínající od stránky 000 H na stránku FFF H . Protože jsou kódy na různých stránkách propojeny, kompilátor používá indexové adresování k propojení všech souvisejících adres na různých stránkách. Například za předpokladu, že stránka 0, stránka 1 a stránka 2 jsou pro jednu aplikaci a každá má 555 H adresy, které jsou vzájemně propojeny, kompilátor zkompiluje takovým způsobem, že když 555 H ze stránky 0 je přístupný, 00000 H bude v základním registru a 555 H bude v rejstříku. Když 555 H ze stránky 1 je k dispozici, 00001 H bude v základním registru a 555 H bude v rejstříku. Když 555 H ze strany 2 je k dispozici, 00002 H bude v základním registru a 555H bude v indexovém registru. To je možné, protože adresy lze identifikovat pomocí štítků (proměnných). Různí programátoři se musí dohodnout na názvech štítků, které se použijí pro různé připojovací adresy.

Stránka Virtuální paměť
Stránkování, jak bylo popsáno výše, může být upraveno tak, aby se zvětšila velikost paměti v technice, která se nazývá „Page Virtual Memory“. Za předpokladu, že všechny stránky fyzické paměti, jak bylo popsáno dříve, mají něco (instrukce a data), ne všechny stránky jsou aktuálně aktivní. Stránky, které nejsou aktuálně aktivní, jsou odeslány na pevný disk a jsou nahrazeny stránkami z pevného disku, které je třeba spustit. Tímto způsobem se zvětší velikost paměti. Jak počítač pokračuje v provozu, stránky, které se stanou neaktivními, jsou vyměněny za stránky na pevném disku, což mohou být stále stránky odeslané z paměti na disk. To vše zajišťuje jednotka správy paměti (MMU).

6.11 Problémy

Čtenáři se doporučuje vyřešit všechny problémy v kapitole, než přejde k další kapitole.

1) Uveďte podobnosti a rozdíly počítačových architektur CISC a RISC. Pojmenujte jeden příklad počítače SISC a RISC.

2) a) Jaké jsou následující názvy pro počítač CISC z hlediska bitů: byte, word, doubleword, quadword a double quadword.
b) Jaké jsou následující názvy pro počítač RISC z hlediska bitů: byte, halfword, word a doubleword.
c) Ano nebo Ne. Znamená doubleword a quadword totéž v architektuře CISC i RISC?

3 a) Pro x64 se počet bajtů pro instrukce v assembleru pohybuje od čeho do čeho?
b) Je počet bajtů pro všechny instrukce v assembleru pro ARM 64 pevný? Pokud ano, jaký je počet bajtů pro všechny instrukce?

4) Uveďte nejčastěji používané instrukce v assembleru pro x64 a jejich význam.

5) Uveďte nejčastěji používané instrukce v assembleru pro ARM 64 a jejich význam.

6) Nakreslete označené blokové schéma starého počítače Harvard Architecture. Vysvětlete, jak se jeho pokyny a datové funkce používají v mezipaměti moderních počítačů.

7) Rozlišujte mezi procesem a vláknem a uveďte název procesu, který zpracovává procesy a vlákna ve většině počítačových systémů.

8) Stručně vysvětlete, co je to multiprocessing.

9) a) Vysvětlete stránkování jako použitelné pro architekturu počítače x86 386 µP.
b) Jak lze toto stránkování upravit, aby se zvětšila velikost celé paměti?