Számítógépek és processzorok Elvek, felépítés, működés utolsó módosítás: 2019.I.31.
I.1. Mi az a számítógép? Nem triviális kérdés! Sok különböző felépítésű, működésű és célú számítógép létezik. Személyi számítógép, szuperszámítógép, beágyazott rendszer stb. Analóg vs digitális, bináris vs decimális vs trináris, boole – fuzzy - neurális – kvantum – dns ...
Ez?
Vagy ez?
Netán ez?
Esetleg ez?
E?
Ez meg mi?
Hát? De! programozható!
I.2. Alapelvek Algoritmus: egy probléma megoldásához használt eljárás, módszer, utasítássorozat -» program Al Hvarizmi (kb.780-850), perzsa tudós nevének torzított alakjából, aki „Hiszáb al-dzsabr va l-mukábala” c. munkájában lefektette az algebra alapjait.
Alapelvek Univerzális, programozható számítógép
Computer (1949) NASA 1949
Alapelvek Számítógép Computer: eredetileg a számításokat végző embereket hívták így Számológép (hagyományos): matematikai számolások elvégzésére képes Számítógép: a számológép + az őt kezelő személy Ebből a személyből is idővel gép lett, így született a modern számítógép
Analóg számítógép Lehet elektromos, mechanikus, optikai, stb. Elektronikus analóg szg. alapelve: Különböző fizikai jelenségeket leíró differenciál/integrál egyenletek megvalósíthatók elektronikus módon (analógia), jellemzően R,C,L tagokkal és műveleti erősítőkkel. Bemenete és kimenete pl. feszültség időfüggvény. Ennek tárolása, visszaolvasása problémás lehet. Kijelzése pl. grafikus (pl.szkópképernyő, plotter). Sokszor kombinált elektro-mechanikai-optikai megoldást használtak (pl. bombázó vagy légelhárítás tűzvezérlése).
Analóg számítógép Az analóg számítógépek jellemzően céleszközök voltak, így nem voltak átprogramozhatóak. A kutatási és oktatási célúakat vezetékezéssel lehetett „programozni”. (Lényegében műverősítővel megvalósított összegző, kivonó, integráló, deriváló, stb. fokozatok összekötése stb.)
Analóg számítógép Analóg számítógép előnyei: Elvileg folytonos értékkészlettel és értelmezési tartománnyal dolgozik, nincs kvantálási hiba, cserébe az analóg rendszerekre jellemző zajok, zavarok vannak. A 20.sz.közepén sok feladatra (diff.egyenletrendszerek) jóval gyorsabbak (és kisebbek) voltak a digitális gépeknél. Modern kísérletek: hibrid (analóg-digitális ötvözet) integrált változatban (VLSI). https://en.wikipedia.org/wiki/Analog_computer
Analóg számítógép Bal felül: logarléc Bal alul: Norden Mk.XV, bombázórepülők célzókészüléke Jobb felül: Akat-1 lengyel oktatógép Jobb alul: X-15 kísérleti repülőgép szimulátora
Digitális számítógép A bemenő adatsor időben is diszkrét (mintavételezett) és értékkészletben is diszkrét (kvantált). Ezeket könnyű tárolni és visszaolvasni. A kvantálás miatt elvben pontatlanabb, de cserébe az analóg zajra kevésbé érzékeny. Kb. a 1960-70-es évekre egyeduralkodó lett.
Digitális számítógép A mintavételezett kvantált adatsorok feldolgozására a matematika egy új ágát hozták létre (numerikus analízis), nem volt triviális téma. Cserébe a programokat könnyebb tárolni, módosítani, cserélni, nem kell a hardverhez hozzányúlni. Így a már létrehozott módszerek, algoritmusok birtokában könnyebb programozni. Továbbá az analóg számítógépek többnyire a problémák egy bizonyos fajtájának megoldására készültek, kevésbé univerzálisak, mint a digitális. (Pl amelyik jó egy erőmű modellezésére, azt nem fogjuk átprogramozni mp3 kódolásra...)
(Digitális) Számítógép Program: számítások, műveletek sorozata, amelyek adott bemenő adatokból (input) a kívánt kimeneti adatokat (output) előállítja (matematikailag: algoritmus, azaz annak megvalósítása adott gépen) Tárolt program: előre bevihetjük a programot és az adatokat egy (több) tárolóba (memória), ahonnan a gép a saját ütemezésében be tudja hívni
Számítógép A tárolt program teszi lehetővé az összetettebb műveleteket, vezérlési lehetőségeket, időzített működést stb. Fontos részei a feltételes utasítások (elágazások), ugrások (függvényhívások) és ciklusok – ezek megkülönböztetik az egyszerű, soros (szekvenciális) programú számológépektől Sok változata megengedi a program futása közbeni emberi beavatkozást, így interaktív programok születhettek (vs. megszakítás nélkül futó tudományos számítások, amik a korai gépek egyedüli alkalmazásai voltak)
Személyi számítógép (Personal Computer) Otthoni és munkahelyi használatra. Emberre szabott beviteli, kiviteli és feldolgozó eszközökkel (perifériákkal, interfészekkel): billentyűzet, egér, képernyő, nyomtató, mikrofon, hangszóró és ezek meghajtó egységei, háttértárak stb. közepesen nagy teljesítményigényű feladatokra van kitalálva jellemzően interaktív programok céljára
Személyi számítógép Apple II (1977)
Személyi számítógép Az eredeti IBM-PC (IBM 5150) (1981) Az IBM vezette be a personal computer elnevezést a köztudatba.
Személyi számítógép ZX-80 (1980) ZX Spectrum (1982)
Személyi számítógép Commodore-64 (1982) It is listed in the Guinness World Records as the highest-selling single computer model of all time,[6] with independent estimates placing the number sold between 10 and 17 million units.
Mobil számítógépek Valahol a PC/laptop és a beágyazott rendszer között. „Okostelefon”, tablet, stb. Nem szükséges részletesebben ismertetni
Mobil személyi számítógép
Szuperszámítógép Tudományos és mérnöki számításokhoz. Működtetése gyakran más számítógépeken keresztül történik, saját humán interfészek nem szükségesek Nagyon nagy számítási teljesítmény (sok processzoros párhuzamos rendszerek) Akár hónapokig is számolhat egy feladatot Emberi beavatkozási nélküli, nem interaktív programok
Szuperszámítógép IBM's Blue Gene/P supercomputer at Argonne National Laboratory runs over 250,000 processors using normal data center air conditioning, grouped in 72 racks/cabinets connected by a high-speed optical network[1]
Beágyazott rendszer (Embedded system) Különböző eszközök (gépek) vezérlésével foglalkozó, azokba beépített számítógép. Gyakran nem rendelkezik humán input-output interfésszel (vagy azt más eszközön keresztül végzi) Más eszközökkel való kommunikációra alkalmas IO eszközei vannak (interfészek, portok) Kis, közepes számítási teljesítmény
Beágyazott rendszer a százalékos értékek megkérdőjelezhetőek?
Beágyazott rendszer
Beágyazott rendszer
Beágyazott rendszer humán interfésszel
II. Számítógépek és processzorok működése
II.1. Számítógépek alapelvei Turing, 1936 „On computable numbers...” Neumann, 1945 „First Draft of a Report on the EDVAC” Turing 1946 Automatic Computing Engine fenti publikációk egymásra is hatottak, ezek írják le a ma Neumann-elvekként ismert alapokat tárolt (flexibilis) program, kettes számrendszer, egész, fixpontos, lebegőpontos ábrázolás, kettes komplemens alapvető felépítés Turing 1950 „Computing machinery and intelligence” http://www.alanturing.net/turing_archive/archive/l/l71/l71.php
Neumann elvek (számítógép) Kettes számrendszer, számábrázolási formátumok Tárolt program; tárolt adatok alap blokkvázlat (ALU, CU, IO, memória, perifériák)
Számítógép felépítése Tápegység (power supply unit, PSU) Alaplap (mainboard) Központi feldolgozó egység (CPU, Central Processing Unit) Memóriák (RAM, ROM) Kiegészítő áramkörök (buszvezérlők, memóriavezérlők, órajelgenerátor stb.) Ki- és bemeneti (IO, input-output) illesztő áramkörök (interfészek) háttértár illesztők külső adatkapcsolati illesztők (soros, párhuzamos portok, hálózati illesztők) videó és hang illesztők Perifériák (az interfészekhez csatlakozva) humán interfészek (kijelző, billentyűzet, egér, nyomtató, hangszóró stb.) háttértárak, biztonsági rendszerek
II.2. Processzorok A számítógépben több mikroprocesszor vagy mikrovezérlő is lehet. Ezek közül egy van, amelyik a számítógép többi részét vezérli, amelyik a fő szoftvereket futtatja az oprendszertől a felhasználói programokig. Ez a CPU (Központi vezérlő egység). Előfordul, hogy egy gépben több (jellemzően egyforma típusú) mikroprocesszor együtt látja el a CPU feladatát; vagy maga a processzor belül tartalmaz több "magot" (core).
Miért mikroprocesszor? (Motorola 6800, 1974) Nagyon nem mikro processzor (?1940-es, 50-es évek) Nem eléggé mikro processzor (PDP-11, 1970)
II.2.1 Processzor felépítése Processzor fő részei: ALU: aritmetikai és logikai egység (arithmetic and logic unit) CU: vezérlő egység (control unit) regiszterek: kisméretű belső memória az ideiglenes adatoknak (számolási részeredményeknek) adatbusz csatlakozás: a bináris adatoknak (jell. párhuzamos) címbusz csatlakozás: a külső memória és perifériák címzéséhez (jell. párhuzamos)
Általános, egyszerű blokkvázlat
Neumann vs. Harvard architektúra közös adat és program tárolás ugyanabban a RAM-ban, pl. PC-n (vagy közös buszon érhetőek el, nem használhatóak egyszerre) Harvard: külön program és adat tárolás (külön memória és külön buszon) (pl. mikrovezérlők) PC-n belül a cache sokszor felosztható instruction cache és data cache-re Harvard módon variációk ...
Példa Neumann-architektúra
Példa Flash program- memória RAM Harvard-architektúra (PIC mikrovezérlő) Figyeljük meg, hogy a programmemória és a RAM cellamérete is különböző!
II.2.2. Processzor működése Szüksége van egy (általában kívülről megkapott) órajelre (clock). Ennek ütemére végzi a processzor a feladatok lépéseit, olvassa be és küldi ki az adatokat. Egy művelet elvégzése több órajel-ütemet is igénybe vehet. Az egyes utasítások végrehajtási ideje különböző lehet. Fentiek, a pipeline és a párhuzamos feldolgozás stb. miatt az órajel frekvenciája nem egyértelmű mutatója a műveletvégrehajtási sebességnek
Processzor működése (Klasszikus egymagos Neumann-arch. mikroproc.) Utasítás beolvasása: CPU kiteszi a Program Counter (PC) regiszterben lévő memória címet a címbuszra (address bus) CPU a vezérlőbuszon (control bus) jelzi, hogy a memóriát (RAM/ROM) akarja elérni (pl. IO/M jelvezetékkel) CPU a vezérlőbuszon jelzi, hogy olvasást akar végrehajtani (pl. R/W jelvezetékkel) A memória egység címdekódere előállítja a címből és az IO/M jelből a megfelelő memóriamodul engedélyező jelét (pl. EN vagy CS) A memória megkapja a címet a címbuszán, és a read jelet, válaszul kiadja az adatbuszán a címzett helyen lévő adatcsomagot (ált. 8bit vagy n*8bit). Szükség esetén data ready vagy hasonló értelmű jelzést küldhet a vezérlőbuszon, ha az adat biztosan az adatbuszon van és beolvasható
Processzor működése Utasítás beolvasása folyt.: CPU beolvassa az adatbuszon lévő adatot (fetch) az Instruction Register-be CPU valamikor eközben növeli eggyel az utasításszámlálót (PC) CPU vezérlő egysége (Control Unit) értelmezi az utasítást (decode) Szükség esetén utasítás következő részének (pl. paraméter, memóriacím) beolvasása az előzőek szerint Utasítás végrehajtása (execute). Ha van számolási eredmény, annak beírása belső regiszterbe vagy kiadása adatbuszra (memóriacím kiadása címbuszra, write memory parancs). Ha ugrás volt, akkor Program Counter növelése (ilyenkor a pipeline is törlésre kerül).
Óraciklusok Órajel periódusideje (System clock period) (T) Gépi ciklus (Machine cycle) (n*T) egy utasítás végrehajtásának egyes lépései, pl. beolvasás, értelmezés, végrehajtás, kiírás Utasításciklus (Instruction cycle) (több gépi ciklus)
Közös része minden utasításnak órajel periódus LD B,C T1 T2 T3 T4 T5 M1 Opcode Fetch M1 T1 T2 T3 T4 T5 gépi ciklus ADD A,(HL) T1 T2 T3 T4 T5 M2 T1 T2 T3 T4 T5 Opcode Fetch M1 T1 T2 T3 T4 T5 M1 JP nn T1 T2 T3 T4 T5 M2 T1 T2 T3 T4 T5 M1 Opcode Fetch M1 T1 T2 T3 T4 T5 M3 T1 T2 T3 T4 T5 PUSH HL T1 T2 T3 T4 T5 M2 T1 T2 T3 T4 T5 M1 Opcode Fetch M1 T1 T2 T3 T4 T5 M3 T1 T2 T3 T4 T5 Közös része minden utasításnak átfedés átfedés
Pipeline („csővezeték”) Program futtatás meggyorsítását célzó üzemmód. A gépi kódú utasításokat az előzőekben ismertetett módon kisebb feladatok sorozatára lehet bontani. Ezeket az elemeket (gépi ciklusok) futószalagszerűen hajtjuk végre, azaz pl. amíg egy utasítás a végrehajtási fázisban van, a következő utasítás a dekódolási fázisban, az azutáni pedig a beolvasási fázisban stb. Így, ha pl. négy állomású a csővezeték, akkor négy gépi ciklusonként jönne ki hagyományosan egy utasítás, de most minden ciklusban ki fog egy jönni, azaz négyszeres a gyorsítás (miután kezdetben feltöltöttük a csővezetéket!).
Pipeline („csővezeték”) Többféle pipeline létezik, a kételeműtől az akár húszeleműig. (Pl. PIC és AVR mikrovezérlők 2 elemű, Pentium 4 20 elemű.) https://en.wikipedia.org/wiki/Instruction_pipelining
Pipeline Problémák a pipeline megoldással: vezérlésátadás (ugrás) esetén újra kell tölteni a sort feltételes ugrás esetén lehet, hogy újra kell tölteni a sort előző esetekben a sorban lévő, félig végrehajtott utasítások módosíthatnak regiszter tartalmakat ->hazárd egy utasításnak szüksége lehet olyan paraméterre, amit az időben épp előtte lévő utasítás ad ki, de még nem került visszaírásra Tehát akkor optimális, ha kevés az ugrás (elágazás), vagy azok jól vannak "megtervezve". Akkor optimális, ha kevés az ugrás/elágazás a programban
Pipeline hazárd Képzeljünk el egy 5 lépéses pipeline-t (csak hogy az előző oldalitól különbözőt mutassunk): 1. Instruction fetch 2. Instruction decode and register fetch 3. Execute 4. Memory access 5. Register write back Vegyük a következő példa programrészletet (pszeudokód): B=3; C=B; Hajtsuk végre t1 óraciklussal kezdve, ciklusonként egy pipeline lépéssel. Az 1. utasítás eredménye az 5:write-back lépésben íródik bele a B regiszterbe, ez t5 időpontban lesz meg. A 2. utasítás a saját 2:register fetch lépésében olvassa be B regiszter értékét, ez t3 időpontban történik, azaz hamarabb, mint ahogy az 1. utasítás beleírt volna. https://en.wikipedia.org/wiki/Instruction_pipelining
Pipeline megoldási lehetőségek: ugró utasítások: behívásakor a mögötte lévő sort üres utasításokkal (nop=no operation) feltölteni feltételes ugrásnál megjósolni a következő címet (branch prediction) ilyen utasításoknál vagy a soron következő utasítás jön, vagy elugrik egy másik címre; statikus jóslás esetén a soron következő tippel főleg ciklusok esetén jó eséllyel jósolhatunk; a compiler pedig sokat segíthet a megfelelő gépi utasítások kiválasztásával adatütközés lehetősége esetén: a két utasítás közé betenni nop-ot; jelzőbit a regiszter módosítását mutatja, késlelteti a következő utasítás végrehajtását pipeline szintjei közötti belső adatátvitel
Megszakítások (Interrupt) Hardveres megszakítás: Külső (CPU-n kívüli) eszköz jelezheti a CPU-nak, hogy törődést igényel (interrupt request, IRQ) CPU-nak van külön bemenete erre a célra (vezérlőbuszon, ált. INT néven) CPU visszajelezheti az elfogadást (INTA: interrupt acknowledge) Elfogadás esetén végrehajt egy szubrutint (programot), ami foglalkozik a külső eszközzel
Megszakítások (Interrupt) Hardveres megszakítás fajtái: szintvezérelt (level triggered): egy bizonyos időszakban ellenőrzi a szintet; elkerülhető a zajimpulzusok hatása élvezérelt (edge triggered) feszültségváltozást érzékel; célszerű hozzá egy tároló (latch), hogy cpu ne felejtse el, hogy mit kell csinálnia, ha nem megfelelő időben jött az interrupt; pergésmentesítés is szükséges lehet
Megszakítások (Interrupt) Szoftveres megszakítás: különleges helyzet áll elő utasításvégrehajtás közben (trap vagy exception); pl. nullával osztás szoftver szubrutin meghívás (INT utasítás), pl. BIOS vagy oprendszer függvények meghívása (pl. tégy ki egy karaktert a képernyőre)
Megszakítások kezelése CPU elmenti a PC (utasításszámláló) (eggyel növelt) értékét a verembe (stack) betölti a megszakítás kezeléséhez szükséges alprogram kezdőcímét végrehajtja a programot (ISR: interrupt service routine) return (ret, iret vagy hasonló) utasítás hatására visszaolvassa PC korábbi értékét a veremből; így visszatér a korábbi program futtatásához
Verem (stack) LIFO (last in, first out) jellegű memória ált. RAM egy része van erre a célra felhasználva; lehet fix méretű vagy dinamikus lehet fizikailag külön is megvalósítva, pl. mikrovezérlőkben ha megtelt, a következő verembe mentésnél stack overflow hibaüzenetet kapunk (jellemzően a program futása megszakad vagy végtelen ciklusba kerül ("lefagy"))
Megszakítások kezelése CPU többnyire csak a PC-t menti el verembe, így nekünk (szubrutin írójának) kell gondoskodnia arról, hogy az interrupt rutin elején a többi regiszter értékét is elmentsük, ha azokat a szubrutin felülírná, és a rutin végén visszatölteni (szintén veremből) szubrutin elején célszerű kiadni a disable interrupt (di) utasítást, legalább, amíg a fenti mentés megtörténik, hogy ne szakítsa félbe egy újabb interrupt; a rutin végén enable interrupt (ei) (nem minden interrupt bemenet tiltható (maszkolható))
Megszakítások kezelése vektorosan kezelt int.: pl. 8085 processzor hardveres irq: a TRAP, RST5.5, RST6.5, RST7.5 bemenetekre érkező kérés előre eltárolt memória címekre ugrik szoftveres irq: az utasításban megadott vektorra ugrik (pl. int 21h (DOS függvényhívás))
Megszakítások kezelése nem vektoros int: pl. 8085: az irq-t adó külső eszköz az adatbuszra tesz egy utasítást, amit a cpu beolvas; ez jellemzően egy call vagy rst (szubrutin hívás utasítás) egy memóriacímmel (a call/rst hívás után is működik a return, ugyanúgy a verembe automatikusan mentett PC-vel) 8086: hasonló, de itt egy számot kap az adatbuszon, amiből szorzással előállítja az interrupt vector címet (a memória egy adott részén van a vector table, ami a szubrutinok kezdőcímeit tartalmazza, tehát pointer táblázatról van szó)
Megszakítások kezelése peripherial interrupt controller: eredetileg külön külső IC a bemeneteire az egyes eszközökből jövő int vonalak jönnek, a kimenete a CPU int bemenete; ill. adatbuszra is csatlakozik felprogramozható az interrupt vektorok címeivel (vagy offsetjeivel) a bemenetei között prioritási sorrendet lehet felállítani (tip. a kisebb sorszámú a legfontosabb)
II.2.3. Utasításkészlet Utasításkészlet (instruction set): a processzor által „hardveresen” ismert utasítások halmaza Gépi kód (machine code): az utasításkészletben található utasítások sorozatából álló program, binárisan tárolva, gyakran hexadecimálisan megjelenítve. Ez a processzor által közvetlenül futtatható program.
Assembly Assembly: a legalacsonyabb szintű, processzorfüggő programozási nyelv. Lényegében a gépi utasításokhoz egy-egy könnyebben megjegyezhető szót rendelünk (mnemonic), ill. megkönnyítjük az adatábrázolást, behelyettesítéseket (tehát pl. a számadatokat írhatjuk decimálisban, a szöveges adatot ascii-ban, az ugrásoknál név szerint hivatkozhatunk a sorokra stb.).
Assembly példa (8086) clrscr proc near mov ax,0b800h mov es,ax mov di,0 mov al,' ' mov ah,07d loop_clear_12: mov word ptr es:[di],ax inc di cmp di,4000 jle loop_clear_12 ret endp http://muruganad.com/8086/8086-Assembly-Lanaugage-Clear-the-screen.html
Fordítás Az eredetileg nem gépi kódban megírt programokat fordítóprogram (compiler) segítségével (régen kézzel!) alakítják gépi kódra. Magasabb szintű (pl. grafikus) nyelveknél ez akár több lépésben (közbenső nyelv használatával) is történhet. Kérdés: milyen nyelven írják a fordítót?
Utasítások típusai (példák) aritmetikai művelet: add, subtract, increment logikai művelet: and, or, xor, complement bitművelet: rotate adatmozgató utasítás: move, exchange vezérlésátadás: jump, call, return feltételes utasítás: jump on condition I/O: in, out stack: push, pop
Utasítások címzési módjai Közvetlen adatmegadás (immediate addressing mode): konstans érték szerepel az utasításban pl. mvi register,data (pl. mvi A,9) Regiszterekkel (register a.m.): egyik regiszterből a másikba pl. mov register1,register2 (mov ax,bx) (2->1) Közvetlen címzés (direct a.m.): konstans memóriacím szerepel utasításban pl. lda address (pl. lda 0xF000) Közvetett memóriacímzés (indirect a.m.): címet regiszter(ek)ben tároljuk (pointer) pl. mov register, M (pl. mov A,HL) (HL a pointer regiszterpár) Relatív címzés (relative a.m.) Egy báziscímhez (vagy program counterhez) képesti eltolást tartalmazza az utasítás (báziscímet is regiszterek tárolják)
Utasításkészlet fajtái RISC: reduced instruction set computer CISC: complex instruction set computer egyéb (pl. OISC: one instruction) szokás szerint nem egységes a definíció, nem egyértelmű a meghatározás
CISC sok utasítás (nem feltétlen!) összetett utasítások (bonyolultabb feladatok megoldhatóak egy utasításból) összetett adatszerkezetek támogatása utasítások többféleképpen, közvetlenül is hozzáférnek memóriához (sokak szerint ez a fő ismérve CISC-nek)
CISC Előnyei: magasabb szintű nyelvekről könnyebb fordítani (?) ha sok összetett utasításra van szükségünk, gyorsabb és rövidebb lehet a programunk a kevés utasítást tartalmazó, de közvetlen memória hozzáférést biztosító változatnál (pl. egyesek szerint a PIC) könnyebb lehet az asm programozás
CISC hátrányai: ha sok bonyolult utasítás van, nehezebb lehet az asm programozás ill. hibakeresés (debug) (ha viszont kevés, de sokat tudó utasítás, az épp megkönnyítheti, ld.pl. 8 bites PIC-ek) uP erőforrást/helyet foglal sok olyan funkció, amit ritkán használunk CISC-et gyakran microcode architektúrával valósítják meg
Utasításkészlet: microcode microcode: a processzoron belül kétszintű a program végrehajtása: a gépi kódú utasításokat még alacsonyabb szintű utasítások (microinstructions) sorozatára bontja (CISC->RISC) kívülről nem látszik – még assembly szinten sem! a gépi kód így könnyebben változtatható a hardver módosítása nélkül; ill. hasonló processzortípusok gépi kódja is hasonló lehet, míg a microcode különbözik (kód hordozhatóság) akár más processzor emulációja is lehetséges könnyebb hardver (processzor) fejlesztés https://en.wikipedia.org/wiki/Microcode
RISC kevesebb utasítás egyszerűbb utasítások memóriából (RAM) jellemzően csak egyszerű írás-olvasás művelet van, azaz RAM-ból beolvassuk értéket uP regiszterébe, onnan férnek hozzá az utasítások (load/store architecture)
RISC előnyei: az összetett utasításokra ritkábban van szükség, így kevesbé hátrányos, hogy azokat szoftverből valósítjuk meg a uP adott méretében az egyszerűbb, kevesebb utasítás megvalósítása gyorsabb műveletvégzést eredményez, ill. maradék helyet pl. regisztereknek, egyéb funkcióknak
RISC igyekeznek arra, hogy utasítások hossza és végrehajtási ideje egyforma (és rövid) legyen elősegíti a pipeline szervezést hátrányai: jobban optimalizált fordítóra van szükség a gépi kód hosszabb lehet, ha sok bonyolult utasítás kell, akkor lassabb lehet
CISC-RISC a különbség, a definíció nem egyértelmű: lehet egy uP-ban kevés, egyszerű utasítás, de összetett memóriakezeléssel lehet egyszerű load/store memóriakezelés, de bonyolult , nagy utasításkészlettel (pl. magasabbszintű matematikai műveletek, mátrixok, hardverkezelés)
Memória címzés Közvetlen Bankválasztós Szegmentált Virtuális
Közvetlen (flat/linear memory model): n bites címbuszon 2n bájt memóriát érhetek el (a memóriacellák általában 1B méretűek) példák: 8085, 6502: 16bit címbusz: 216B=65536B (64kiB) 8086/8088 (IBM-PC): 20bit: 220B= 1MiB 80386, 486, Pentium: 32bit: 232B=4GiB Pentium-4: 36b: 236=64GiB x86-64 uP-k (fizikailag): 252=4PiB
Bank switching egy bank pl. egy RAM modul, ezek közös adatbuszon és közös címbuszon vannak bank mérete ált. a max fizikailag címezhető az egyes bank modulokat az enable (vagy másnéven chip select) bemenetekkel (és kiegészítő áramkörökkel) lehet választani, egyszerre mindig egyet használunk van egy közös (shared) címterület, amelyre ugyanazt a tartományt képezzük le => rendszer régebbi processzoroknál (pl. 16b címbuszúak) használták
Szegmentált memóriacímzés A közvetlenül megcímezhető tartományt kisebb blokkokra (szegmensekre) osztjuk. Logikai cím: segment:offset Segment address (base address): szegmens kezdő címe Offset: memóriacella szegmensen belüli címe A fizikai címet a két részből adjuk össze: fizikai cím=szegmens cím x 2x + eltolás (offset)
Szegmentált memóriacímzés Példa: i8086 uP: 16b adatbusz, 20b címbusz 1MB fizikai címtartomány 20bites cím nem fért volna bele a 16bites regiszterekbe 16 darab 64KiB szegmens 16b szegmens cím, 16b offset fizikai cím=szegmenscím*16+offset cím ebből következően a szegmensek átfedhetnek (overlap)
Szegmentált memóriacímzés A szegmens kezdőcímét a processzor szegmens regiszterében (regisztereiben) tároljuk. Az aktuális programnak többnyire csak az ofszet címet kell kezelnie => kisebb méretű cím, beleférhet kevesebb regiszterbe, rövidebb idő alatt betölti, gyorsabban lefuttatható. Ilyenkor a program csak azt a szegments használja. Külön programok vagy szubrutinok külön memóriaterületet kaphatnak. Elválasztható az oprendszer memóriája az alkalmazásokétól (memory protection).
Szegmentált memóriacímzés 8086 (ill. a későbbi x86 verziókban a real mode) szegmensei és szegmens regiszterei: Code Segment (CS): utasításoknak Stack Segment (SS): veremtár számára Data Segment (DS): egyéb adatok számára Extra Segment (ES): egyéb, pl. string műveleteknek nincs memória (szegmens) védelem!
Szegmentált memóriacímzés Variáció: az egyes programoknak külön főszegmensük van, azon belül saját alszegmensként a CS,DS,SS megjelenhet a szegmens védelem
Virtuális memória A v.m. egy folytonos memória címtartományt mutat a programok felé. A processzorban az MMU (memory management unit) lefordítja a virtuális címet a fizikai címre. A virtuális memóriában egybefüggő terület a valóságban egymástól távol lévő részekből állhat. A lapozás (paging) használatával a virtuális tartomány nagyobb lehet, mint a fizikai RAM. A virtuális címek lefordításánál is lehet védelmi funkciókat megvalósítani.
Lapozás (Paging) A virtuális memóriakezelés része. A programok által igényelt memóriát fix méretű blokkokra, lapokra (page) osztjuk. A lapok tartalma lehet a RAM-ban, vagy a háttértáron (swap file). A page table tartja számon a lapok helyét. Ha egy programnak szüksége van egy lapra, ami nincs bent a RAM-ban, laphiba (page fault) keletkezik, amire válaszul a rendszer megpróbálja a kért lapot a háttértárból a RAM-ba tölteni (és az ott lévő lapot meg kiírni), és újraindítani a hivatkozó utasítást. (Így normál esetben a laphiba nem jelent valódi hibát, kivéve, ha a hivatkozott lap nem létezik.) Megoldás lehet pl. akkor, ha a fizikailag címezhető memóriatartomány nagyobb a ténylegesen rendelkezésre állónál. Vagy ha ugyanakkora, akkor a párhuzamosan futó programok nagyobb területet kaphatnak (nem vonják el egymástól).
Memory protection A futó programok (folyamat, process) saját memóriaterülettel rendelkeznek (segment, page, stb.), erre van írási-olvasási jogosultságuk, a többire nincs (pl. oprendszer által elfoglalt memóriaterületre). Modern processzorok hardver szinten valósítják meg a jogosultságkezelést, védelmet. Megvalósítható szoftver szinten is (lassabb és könnyebben megkerülhető). "Meltdown" és "Spectre" támadások ezt a hardveres funkciót próbálják megkerülni.
Több bájtos számok tárolása szó (word): több bájton tárolt szám (adat) kétféle tárolási (ill. átviteli) mód: little endian LSB first, azaz legkisebb helyiértéket tároljuk legkisebb címen (ill. küldjük először) összeadásnál LSB-vel kezdünk, könnyebb a hardvert megvalósítani big endian MSB first, azaz legnagyobb helyiértéket tároljuk legkisebb címen PIC mikrovezérlőnél a program memória egy celláját hívják word-nek, mert nem 8bites (hanem pl. 14)
Több bájtos számok tárolása Little endian: Intel-AMD x86, x86-64 sorozat Big endian: Motorola 68000 leszármazottak AVR32 IBM System/360, z/Architecture Internet Protocol (IP, TCP, UDP) Bi-endian (beállítható): ARM 3-tól, PowerPC, Alpha, MIPS, Itanium stb. Előkerülhet a probléma akár egy mérőműszer-PC összekötésnél is.. image source: https://en.wikipedia.org/wiki/Endianness
II.3.1. Alaplapok felépítése Jellemzően tartalmazza: CPU RAM (ideiglenes (munka)memória) ROM (tartós memória, pl. BIOS) vezérlő áramkörök (chipset) csatlakozási lehetőség IO eszközöknek, kiegészítő kártyáknak, tápnak
Buszrendszer Busz (sín): az összetartozó bináris információt szállító vezetékek/vezetősávok összessége soros vagy párhuzamos párhuzamos: pl. 8bit adatméret esetén: 8 vezeték, a 8 bit egyszerre érkezik be pl. alaplapi adat- és címbusz, régi nyomtató csatlakozás (LPT/Centronix), régi HDD csatlakozás (PATA/IDE) soros: egy vezeték (vagy kétirányú esetén lehet kettő), így pl. 8bites adatot 8 óraciklus alatt továbbít pl. külső periféria csatlakozások (RS-232, USB), mai HDD (SATA), I2C, SPI (pl. mikrovezérlőkben) NB: Nem BUS, hanem busz! És nem rövidítés! Pontosan ugyanonnan ered, mint az autóbusz szavunk.
Egyszerű buszrendszer
Példa közvetlen memória illesztésre Pl. 4bites adatbusz, 8 bites címbusz, össz.256B memória, ebből 1x64B ROM, 3x64B RAM cím felső 2 bitje választja ki a memóriamodult (címdekódolás nand kapuval
Példa: ZX Spectrum 7805 fesz.stab. logikai kapuk 16kiB ROM Z80 CPU RF modulátor (TV kimenet) logikai kapuk 16kiB ROM Z80 CPU kvarc (cpu) video modulátor kvarc (video) bill. csatl. 8x 2kiB RAM ULA (vezérlő IC) 8 x 4kiB RAM
ZX Spectrum
IBM-PC (8088) (1981) http://lennartb.home.xs4all.nl/coreboot/col2.html
IBM PC-AT (80286) (1984)
80386 Processzor órajele magasabb lett, mint az ISA buszé, szükségessé vált az illesztő hardver c.1987
Pentium Északi híd – Déli híd architektúra 1993
Intel Hub Architecture (IHA) Pentium Pro - ... 1999-2008
Intel PCH architektúra Core sorozat 2008-
shared memory config.
II.3.2 Memória RAM: random access memory, tetszőleges hozzáférésű, írható-olvasható memória, jellemzően illékony ROM: read only memory, csak olvasható (gyárilag írt), nem illékony EEPROM, Flash: olyan ROM, amit megfelelő módszerekkel felhasználó is felülírhat
Memória ROM: rendszer (vagy kiegészítő kártyák) induláshoz szükséges programok, pl. BIOS Alaplapi RAM : processzor munkaterülete, innen futtatja programokat, illetve ideiglenes eredményeket tárol Videó RAM: az alaplapi RAM egy része vagy a videókártyán különállóan; a képernyőn megjelenő tartalmat tárolja
BIOS Basic Input-Output System ROM-ban tárolt kisméretű program A gép indulásakor ezt olvassa be a CPU elsőnek Ez indítja el a háttértáron (pl. merevlemez) tárolt operációs rendszert Bizonyos alapszintű függvényhívásokat is biztosít a programok számára (hardverkezelés) PC-AT óta tartozik hozzá egy program, amivel a PC alapbeállításait lehet módosítani, ezeket RAM-ban tárolja (előtte kapcsolósor volt)
IO/M választás Külön címtartomány (port mapped IO) ugyanaz a cím lehet IO vagy M cím a vezérlő busz (control bus) egyik vezetéke választ IO/M között majdnem ugyanaz, mintha plusz egy vezeték/bit lenne a címbuszban, de az IO címtartomány gyakran kisebb; pl 16b a M-nek, de csak 8b az IO-nak korlátozza a bővíthetőséget
IO/M választás Memóriába leképzett IO (Memory mapped IO) a memória címtartomány egy része IO eszközök számára van fenntartva rugalmasabb lehet fix vagy ideiglenes (átváltható) ha kitöltöttük a teljes címtartományt RAM IC-kkel, akkor egy részüket nem fogjuk tudni elérni ld. pl. „PCI hole” PIC microcontroller: IO funkciók RAM regisztereken keresztül érhetőek el (Special Function Registers) x86: mindkét módot támogat, többnyire memory mapped; 64 biten csak utóbbi
DMA – Direct Memory Access CPU helyett DMA controller-en megy keresztül az adat A DMA controller gyorsabban, hatékonyabban viszi át az adatokat, ill. képes nagy blokkok átvitelére (nem kell külön bájtonként utasítani CPU-t – bár a tömbátvitelt már ismerik a modern processzorok (vektorutasítások)) de bonyolultabb rendszerben (ld pl cache!) cpu dolgozhat tovább
DMA Probléma: buszt egyszerre csak vagy CPU vagy DMA kezelheti. Bájtonkénti átvitel: egyes átvitelek között CPU megkaphatja a buszt (be kell olvasnia az utasításokat stb) (cycle stealing) – pl. real time rendszerekben Tömbösített átvitel (burst mode): CPU vár (hold) Ha memória órajel gyorsabb, mint CPU akkor felváltva férhetnek hozzá (interleaved) Átlátszó (transparent): DMA figyeli, mikor szabad a busz Ha van cache, CPU dolgozhat tovább, de ilyenkor különbség lehet a cache és a RAM tartalma között (cache incoherence) -> cache-t ki kell írni DMA művelet előtt
DMA ISA busz: van egy/két DMA vezérlő, 4/8 DMA csatorna PCI busz: nincs központi vezérlő, bármelyik PCI eszköz kérheti a busz vezérlését a PCI vezérlőtől (déli híd)
SRAM (Static RAM) Minden bit lényegében egy flip-flop. Egy bit általában 6 tranzisztor. Van 4 tranzisztor + 2 ellenállás változat is (többet fogyaszt, kisebb hely). Amíg van tápfesz, megtartja az értékét (nem kell frissíteni). Gyorsabb, mint a DRAM. Kisebb az adatsűrűség (bit/terület), mint DRAM, egy bit több helyet foglal, de egyszerűbb a vezérlése. Drágább. Ilyen van a cache-ben ill. mikrokontrollerekben.
DRAM (Dynamic RAM) Minden bit egy tranzisztor + egy kondenzátor. Nagy adatsűrűség. Rendszeres frissítés kell - külső vezérlő vagy a DRAM-ba beépített (kondi elveszti töltését). 64ms frissítési idő (refresh time). 8192 sor: 7,8us frissítési ciklus Felhasználás: nagy méretű RAM (számítógép)
Cache Sebességnövelő megoldás uP-n kívüli memória hozzáférés lassabb, mint a tokba beépítetté DRAM lassabb, mint SRAM (de nagyobb) cache: kisméretű, gyors SRAM (többnyire) processzoron belül
Cache külső RAM-ból a cache-be töltjük azokat az adatokat, amelyeket a közeljövőben gyakran kívánunk használni futtatott program részei szükségesebb adatok, változók külső RAM-mal szinkronizálni kell! összetett vezérlést igénye többszintű lehet
Cache AMD Athlon 64
II.4. Példák processzor felépítésre
i4004
i8008 (részletesebb)
i8080
i8085
Z80
Z80
Z80 teszt áramkör
MOS 6502
6502 ugyanaz, mint előző, csak részletesebben While other CPUs from the same era used microcode to interpret the instruction, the 6502 had this 130×21 bit PLA Also, note there are no general registers! It can access memory in one cycle, so it uses the zero page 256 bytes as registers „Like its precursor, the Motorola 6800, the 6502 has very few registers. To this end, the CPU includes a zero-page addressing mode that uses one address byte in the instruction instead of the two needed to address the full 64 KB of memory. This provides fast access to the first 256 bytes of RAM by using shorter instructions. Chuck Peddle has said in interviews that the specific intention was to allow these first 256 bytes of RAM to be used like registers. „
i8086 https://www.elprocus.com/8086-assembly-language-programs-explanation/
i8087 FPU (Floating point unit)
i80286
i80386
i80486DX2
Intel Itanium 2001-től; vállalati információs rendszerekhez Intel, HP specifikációk 64b adat és cím floating point 82b compiler dönti el, hogy mely utasításokat végezze el párhuzamosan. akár 6 utasítás / órajel ciklus / mag The processor has thirty functional execution units in eleven groups. Each unit can execute a particular subset of the instruction set, and each unit executes at a rate of one instruction per cycle unless execution stalls waiting for data. While not all units in a group execute identical subsets of the instruction set, common instructions can be executed in multiple units. The execution unit groups include: Six general-purpose ALUs, two integer units, one shift unit Four data cache units Six multimedia units, two parallel shift units, one parallel multiply, one population count Two 82-bit floating-point multiply–accumulate units, two SIMD floating-point multiply–accumulate units (two 32-bit operations each)[33] Three branch units
MPU+GPU integrated