Milan Schmotzer
Architektúra počítačov Učebný text si prosím prečítajte najprv iba orientačne. Spočiatku nemusíte rozumieť termínom, ktoré sú kvôli krátkej verzii textu vysvetlené hlbšie v texte. Až druhé čítanie Vám umožni textu dobre porozumieť. Kapitolky, ktoré sa potrebujete naučiť, si potom dvakrát pomaly prečítajte.
Obsah Informácie ................................................................................................................................................................. 1 Úvod.......................................................................................................................................................................... 1 Logické systémy (kombinačné a sekvenčné obvody) ............................................................................................... 3 Počítač ....................................................................................................................................................................... 3 Zbernice .................................................................................................................................................................... 3 Rýchlosť počítača ..................................................................................................................................................... 4 Pamäť ........................................................................................................................................................................ 4 Mikroprocesor ........................................................................................................................................................... 5 Registre ................................................................................................................................................................. 6 Aritmeticko – logická jednotka ............................................................................................................................. 6 Inštrukčný (strojový) cyklus ................................................................................................................................. 6 Zreťazenie ............................................................................................................................................................. 8 Strojová inštrukcia a jej operandy ......................................................................................................................... 9 Režimy adresácie ................................................................................................................................................ 10 Charakteristické typy strojových inštrukcií ......................................................................................................... 10 Registre u mikroprocesorov Intel 8086 a vyšších ............................................................................................... 11 Cykly ................................................................................................................................................................... 12 Odovzdávanie parametrov procedúram............................................................................................................... 13 Programovanie ........................................................................................................................................................ 14 Radiče zariadení ...................................................................................................................................................... 15 Programové prostriedky pre komunikáciu so zariadeniami .................................................................................... 15 Ovládače ................................................................................................................................................................. 15 Tvorba prenositeľných aplikácií ......................................................................................................................... 16 Komunikácia procesora s operačnou pamäťou ....................................................................................................... 16 Komunikácia procesora so zariadeniami................................................................................................................. 16 Prerušenia ................................................................................................................................................................ 16 Priamy prístup do pamäte – DMA .......................................................................................................................... 19 Vyrovnávacia pamäť mikroprocesora Pentium ....................................................................................................... 20 Urýchlenia mikroprocesora Pentium....................................................................................................................... 21 BIOS ....................................................................................................................................................................... 21 Spustenie počítača ................................................................................................................................................... 22 TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
UT
TU
TU
UT
UT
TU
UT
Informácie Informatika, resp. informačná veda, sa zaoberá získavaním (a prípadným separovaním), transportom, transformáciou (t.j. spracovaním, môže byť ľubovoľne zložité) a uchovávaním informácií. Rozlišujeme údaje (numerické alebo alfanumerické reťazce, ktoré samé o sebe nemajú žiaden význam – predstavujú fakty, ktoré sa spracúvajú), informácie (údaje organizované tak, že majú význam pre toho, kto ich prijíma), poznatky (súbory informácií) a znalosti (odvodzovaním nad bázou poznatkov získava systém schopnosť riešiť problémy z nejakého okruhu problémov, čiže určitú znalosť problematiky).
Úvod V celom tomto dokumente uvedené informácie sa principiálne týkajú všetkých počítačov, dokument je však zameraný špeciálne na architektúru PC, aby sa pri snahe o pochopenie textu mal čitateľ o čo oprieť. PC bolo vybrané pre jeho rozšírenosť v našej oblasti. Čo sa týka procesorov, text v celom dokumente sa zväčša týka 32 bitového mikroprocesora 80386 a vyššieho (Pentium) prepnutého do tzv. reálneho režimu. Bežne hovoríme o šírke slova, ktoré je schopný procesor
Procesor, inštrukčné a zbernicové cykly, I/O, prerušenia, DMA, VP, BIOS apod.
spracovať. 32 bitový počítač pracuje s 32 bitovými slovami, to znamená, že jeho registre pre celé čísla majú kapacitu 32 bitov. Konkrétne u mikroprocesorov Intel 80386 a vyšších však slovom nazývame iba polovicu registra (16 bitov), lebo vznikli rozšírením starších 16 bitových mikroprocesorov. Toto nedodržanie názvoslovia je ale len výnimkou. Samozrejme jestvujú či jestvovali aj procesory s nezvyklou šírkou slova, napríklad 9 bitov, 40 bitov. Okrem údajov sa do registrov môžu „schovávať“ aj interné parametre procesora (absolútne neprístupné programátorovi), takže pokojne aj 32 bitové Pentium môže mať registre o kapacite napríklad 40 bitov. 32 bitov „vidí“ programátor, zvyšné sú prístupné len interným zariadeniam procesora. V reálnom režime sú novšie mikroprocesory plne kompatibilné s Intel APX 8086, pričom sú však omnoho rýchlejšie a môžu využívať 32 bitové inštrukcie, ktoré šestnásťbitový mikroprocesor 8086 nemal. V reálnom režime mikroprocesorov 80386 a vyšších (teda aj Pentií) je možné používať 8 (slabikové), 16 (slovné) i väčšinu 32 bitových (dvojslovných) inštrukcií, hoci 32 bitové inštrukcie sú pre tento režim emulujúci staršie procesory „neštandardné.“ Lepšie operačné systémy nepoužívajú reálny, ale chránený režim. Intel vyrába mikroprocesory rady Pentium tak, aby sa dali používať buď v chránenom alebo v reálnom režime. V chránenom režime sa dnes pochopiteľne používajú väčšinou už len 32 bitové programy. Základnou črtou chráneného režimu je ochrana aplikácií jednej pred druhou takým spôsobom, že pri spustení bývajú umiestnené do pre ne vyhradenej časti operačnej pamäte. Každá aplikácia môže mať týchto častí pridelených viac. Nazývame ich segmenty. Pre každý segment operačnej pamäte je v špeciálnej tabuľke zapísaná adresa jeho začiatku a limit – konečná hranica pre segment vymedzenej časti operačnej pamäte. Pred prístupom aplikácie do oblasti nového segmentu, t.j. pri zmene obsahu segmentového registra, sa mikroprocesor musí uistiť v tom, či má aplikácia právo do segmentu zapisovať a z neho čítať. Ak toto právo nemá alebo ak sa pokúsi prekročiť limit svojho segmentu, procesor jej to nedovolí. Táto časť ochrany je sčasti implementovaná aj na úrovni operačného systému. Prístupové právo k segmentom aplikácii udeľuje pri jej spustení operačný systém, základný softvér, ktorého úlohou je ovládať a riadiť hardvér a ďalší softvér počítača. Operačný systém počítača má výsadné postavenie, preto môže počítač a aplikácie v ňom ochraňovať pred nesprávnymi zásahmi používateľa ako aj pred útokmi z počítačovej siete. Najznámejšie počítačové operačné systémy – Linux a Windows XP – sú vyrobené tak, že aplikácia nemôže priamo manipulovať s hardvérom. Napríklad nesmie sama zapisovať na pevný disk. Ak chce niečo zapísať na zariadenie, musí zavolať službu operačného systému – niektorú funkciu zo sady funkcií poskytovaných aplikáciám tzv. aplikačným programovým rozhraním operačného systému. Výhodou je, že zariadenie je takto chránené pred chybným kódom. Výhodou je aj to, že aplikácia, a teda ani programátor, nepotrebuje vedieť, ako presne sa ukladajú údaje na disk v tomto konkrétnom počítači. Oddelenie aplikácií od hardvéru ochraňuje hardvér pred nesprávnou manipuláciou a odbremeňuje programátora od nutnosti poznania všetkých možných hardvérových zariadení. Umožňuje tým písať prenositeľné aplikácie, ktoré sú navyše kratšie – neobsahujú kód obsluhy všetkých možných zariadení. Namiesto programátora aplikácie sa o zariadenie stará operačný systém pomocou ovládačov. Operačný systém najlepšie vie, ako organizovať údaje na externých zariadeniach. Ovládač zasa vie dobre využiť vlastnosti zariadenia. Ovládače zariadení sú, zjednodušene povedané, malé programy dodávané výrobcom konkrétnych zariadení. Výrobca môže v záujme dosiahnutia rýchlosti do zariadenia implementovať rôzne funkcie. Ním dodaný ovládač má potom samozrejme najlepšie šance dobre ovládať zariadenie, aby sa čo najlepšie využili kvality zariadenia a dosiahol sa maximálny výkon. Výhodou chráneného režimu je celková ochrana aplikácií jednej pred druhou, takže chyby alebo dokonca pád jednej aplikácie neohrozia žiadnu inú aplikáciu. (To preto, že aplikácie nemôžu zasahovať do pamäťových segmentov pridelených iným aplikáciám.) Výhodou je napríklad aj to, že tabuľka prerušení sa v chránenom režime môže nachádzať na ľubovoľnom mieste operačnej pamäte, pretože procesor si v špeciálnom registri pamätá adresu jej začiatku.1 Celý TP
TP
1 PT
PT
V reálnom režime sa tabuľka musí nachádzať presne na začiatku operačnej pamäte. strana
2
Procesor, inštrukčné a zbernicové cykly, I/O, prerušenia, DMA, VP, BIOS apod.
chránený režim je plný rôznych tabuliek. Aby procesor vedel, kde presne sa v operačnej pamäti tabuľky nachádzajú, v na to vyhradených registroch si uchováva adresy ich začiatkov aj údaje o ich veľkosti. Existuje samozrejme aj tabuľka segmentov, v ktorej sú pre každý segment uložené jeho začiatočná adresa (aby procesor vedel zrátať segment+offset), limit a prístupové práva. Všetky tabuľky sú uložené v segmentoch operačnej pamäte, takisto aj zásobník. Zásobník je realizovaný v bežnej operačnej pamäti.
Logické systémy (kombinačné a sekvenčné obvody) Binárne informácie sa v digitálnych výpočtových zariadeniach spracúvajú pomocou logických zapojení, obvodov, ktoré menia binárne slová na iné binárne slová. Nech má logický obvod n vstupných a m výstupných vedení. Na vstupných vedeniach môžu byť zadané binárne slová x1, x2, ..., xn a na výstupných vedeniach sa objavia v závislosti od vstupu binárne slová y1, y2, ..., ym. xi a yj je 0 alebo 1. Ak pri logickom obvode závisí výstup len od príslušného vstupu, tak hovoríme o kombinačnom obvode, ak závisí ešte aj od predchádzajúcich vstupov, tak ide o obvod s pamäťou, o sekvenčný obvod. Obvody pozostávajú z hradiel a pamäťových prvkov – preklápacích (klopných) obvodov. Prostriedkami opisu sú boolovská algebra a konečné automaty. B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
Počítač Technicky je „mozgom“ či „srdcom“ počítača aspoň jeden centrálny procesor. Presnejšie označenie je centrálna procesná jednotka alebo centrálna procesorová jednotka. Ak ide o univerzálny počítač (schopný napríklad prehrávať multimédiá, riadiť stroje a vykonávať zložité matematické výpočty), centrálny procesor označujme ako univerzálny. V angličtine hovoríme zvyčajne iba o centrálnej procesorovej jednotke – CPU, t.j. Central Processing Unit resp. Central Processor Unit. Nevyhnutnou súčasťou počítača je operačná pamäť – OP. V cenníkoch býva nie celkom vhodne označovaná ako RAM či RWM. Centrálny procesor spolu prípadnými pomocnými procesormi a s operačnou pamäťou tvoria výkonné jadro počítača. Ak chceme s jadrom počítača komunikovať, potrebujeme vstupno-výstupné zariadenia. Bývajú označované skratkou V/V alebo I/O, čo je odvodené z anglického slovného spojenia Input/Output devices. Všetky bežne známe súčasti počítača, napríklad pevný disk, mechanika CD-ROM, disketová mechanika, myš, klávesnica, grafický adaptér (tzv. grafická karta) či monitor, sú externými vstupno-výstupnými zariadeniami. Voláme ich tiež prídavnými alebo sekundárnymi zariadeniami. Potom napríklad operačná pamäť je primárna pamäť a pevný disk je sekundárna pamäť. ☺ Počítač je len hardvér – hŕba železa. ☺ Nebol by funkčný bez programov. (Podobne ako televízor bez antény či rádiotelefón bez SIM karty.) Základným programom počítača je jadro operačného systému. Obsluhuje hardvér a prideľuje ho aplikáciám. Jadrom poskytované funkcie slúžia aplikáciám na komunikáciu so zariadeniami. Používateľské aplikácie nakoniec slúžia používateľovi, ktorého niektorí považujú za súčasť počítača. Počítač tvorí hardvér, operačný systém, pomocný softvér, aplikačný softvér a používateľ. Hardvérom sa zaoberá predmet Princípy počítačov. Operačným systémom sa zaoberá predmet Operačné systémy a počítačové siete. Pomocným (tzv. systémovým) softvérom sa zaoberá predmet Systémové programovanie. Aplikačným softvérom sa zaoberajú všetky programátorsky a používateľsky orientované predmety.
Zbernice Funkčné jednotky výpočtového zariadenia možno prepojiť tak, že sa každá dvojica zariadení, medzi ktorými môže dôjsť k výmene správ, navzájom spojí komunikačným kanálom (prenášajú sa ním adresy, údaje i riadiace signály). „Kanálový“ počítač je však zväčša potrebné tvoriť „na strana
3
Procesor, inštrukčné a zbernicové cykly, I/O, prerušenia, DMA, VP, BIOS apod.
objednávku“ zákazníkovi, je teda drahý. V prípade zbernicovej štruktúry nám postačuje jediný prenosový kanál, na ktorý sú napojené všetky zariadenia. Nazývame ho zbernica, anglicky bus.2 Je to lacnejšie riešenie a ľahšie sa do počítača pridávajú ďalšie zariadenia – stačí ich nakonfigurovať a pripojiť k príslušnej zbernici, ak už jej kapacita nebola vyčerpaná. Zbernice majú časti pre signály riadiace RZ (obojsmerná), adresové AZ (iba von z procesora či obvodu DMA) a dátové DZ (obojsmerná). Niekedy hovoríme aj o samostatných zberniciach RZ, AZ, DZ. Po adresovej zbernici sa prenášajú adresy generované procesorom alebo obvodom DMA. Adresa identifikuje bunku v operačnej pamäti, s ktorou sa bude pracovať. Po dátovej zbernici sa prenášajú inštrukcie (z pamäte do procesora) a údaje (medzi procesorom a pamäťou alebo V/V zariadením). Signály riadiacej sekcie sa skladajú z povelov generovaných nadradenými zbernicami (ich arbitermi resp. radičmi) zberniciam podriadeným a zo žiadostí, ktorými sa podriadené zbernice obracajú na nadriadené. Prenosová rýchlosť zbernice udáva množstvo údajov, ktoré je možné preniesť po zbernici za jednotku času. V jednom cykle zbernice sa vykoná prenos jediného údaju po zbernici. Napríklad ak je šírka dátovej časti zbernice 8 bitov, v 1 cykle sa prenesie 1 bajt. V našom príklade musí mať zbernica viac ako 8 vodičov, pretože minimálne po jednom sa prenáša „zem,“ aby bolo signály s čím porovnávať a navyše potrebujeme aj signály pre riadiacu zbernicu. Pracovná frekvencia zbernice (Hz) je prevrátená hodnota doby trvania 1 cyklu zbernice. TP
PT
Rýchlosť počítača Rýchlosť počítača závisí od rýchlosti jeho jednotlivých komponent (CPU, OP a V/V zariadení), na spôsobe ich usporiadania, prepojenia, type komunikácie medzi nimi a logike ich činnosti, ďalej na kapacite a redundantnosti zariadení (čím viac CPU má počítač, tým by mal zniesť vyššiu záťaž), na schopnosti paralelnej práce zariadení a na inteligencii operačného systému. Napríklad pod operačným systémom Linux rovnaký počítač pracuje zväčša rýchlejšie ako keď na ňom „beží“ operačný systém Windows XP, pretože Linux je flexibilnejší, lepšie pracuje s operačnou pamäťou a bývajú na ňom vykonávané programy, ktoré nevyužívajú objektový princíp. Objektové programovanie je síce výhodné pre programátora, manipuluje však s väčšími balíkmi dát (všetko sa „zapúzdruje“ do objektov). Preto objektové programy menej účinne využívajú procesorovú vyrovnávaciu pamäť a v operačnej pamäti zaberajú viac miesta. Frekvencia mikroprocesora udáva jeho pracovné tempo. Určuje počet tzv. strojových taktov za sekundu. Býva odvodená od základnej zbernice počítača (nazývanej LZ – lokálna zbernica alebo tiež FSB – Front Side Bus) pomocou obvodu známeho pod názvom „násobička frekvencie“ resp. frekvenčný multiplikátor. Napríklad pri násobiacom činiteli 11,5 a frekvencii lokálnej zbernice 133 MHz dostávame pracovnú frekvenciu mikroprocesora 1530 MHz. Operačná pamäť býva pripojená na zvláštnej s lokálnou zbernicou prepojenej zbernici, ktorá môže mať rýchlosť napríklad 166 MHz. Procesor môže mať tiež svoju vlastnú zbernicu prepojenú s lokálnou zbernicou. Potom sa jeho pracovná frekvencia odvodzuje od nej. Každopádne, násobiaci činiteľ 10 a viac je dnes už celkom bežný a znamená to, že počas jedného taktu lokálnej zbernice prebehne aspoň 10 strojových taktov procesora. Preto sa výrobcovia procesorov snažia vyhnúť komunikácii procesora s operačnou pamäťou nakoľko to je len možné. Dosahuje sa to veľkokapacitnou rýchlou vyrovnávacou pamäťou procesora. Okrem toho, čím viac dát dokáže lokálna zbernica preniesť paralelne (v jednom cykle), tým menej zbernicových cyklov bude potrebných na prenos určitého počtu bajtov.
Pamäť Všetko, čo používame v počítači, musí byť niekde uložené. Údaje sa ukladajú do pamäte.
TP
2 PT
Nemýliť si s autobusom. ☺ strana
4
Procesor, inštrukčné a zbernicové cykly, I/O, prerušenia, DMA, VP, BIOS apod.
Za minimum u pamäte považujeme jednu cifru dvojkového čísla – binary digit, skrátene bit, značka b. Bit môže obsahovať iba číslo 0 alebo 1. Dobre sa dá realizovať v pamäťovom médiu, ktoré sa môže nachádzať v dvoch stavoch – stav zapnutý/vypnutý, zmagnetizovaný jedným smerom alebo iným... Kapacita pamäte býva udávaná v bajtoch B (byte). 1B = 8b. Jeden bajt je teda tvorený ôsmimi bitmi. V dvojkovej aritmetike to znamená, že doň vieme uložiť číslo 0 až 255. To stačí na zakódovanie celej anglickej abecedy a niekoľkých znakov vrátane riadiacich. Zakódovanie tu znamená, že každej hodnote priradíme zmysel. Vytvoríme tabuľku. Najznámejšie sú kódovania textov v podobe tabuliek ASCII alebo EBCDIC. Pamäť môže byť typu RWM – Read Write Memory, t.j. dá sa z nej čítať i do nej zapisovať. Občas sa používa aj pamäť typu ROM – Read Only Memory, pamäť iba na čítanie. Najrýchlejšou pamäťou je procesorový register. Register je množina pamäťových buniek. Je veľmi rýchly, ale jeho kapacita je len niekoľko bajtov. Napríklad Intel Pentium až po verziu Pentium III je 32 bitový mikroprocesor. Kapacita jeho registrov je iba 32 bitov – 4 bajty. Procesor vie pracovať s 32 bitovými operandmi inštrukcií. Slangovo to teda je 32 bitový procesor. Väčšou kapacitou oplýva pamäť RAM. Je možné ju adresovať po bajtoch od 0 až po jej maximálnu kapacitu. Skratka RAM znamená, že ide o pamäť s náhodným prístupom – po prečítaní bajtu z adresy X je možné v ďalšom cykle prečítať bajt z ľubovoľnej inej adresy Y. Sekundárne pamäťové médiá sú ostatné pamäte – pevné disky, diskety, CD-ROM, magnetické pásky, USB čítačky. Oproti operačnej pamäti RAM majú veľkú kapacitu, presnejšie lepší pomer medzi cenou a pamäťovou kapacitou. Až na výnimky pre ne platí, že nie sú typu RAM. To znamená, že napríklad disky poskytujú údaje po veľkých blokoch (512B). Keď chce počítač prečítať napríklad tretí bajt, musí do operačnej pamäte načítať celý blok o veľkosti 512B alebo dokonca viac blokov. Potom v tomto bloku vyhľadá tretí bajt a ten použije...
Mikroprocesor Procesor môže byť špecializovaný na určitú činnosť (grafický procesor v televízore, matematický koprocesor v počítači) alebo môže byť univerzálny. Univerzálny procesor býva tiež označovaný ako srdce či mozog počítača. V angličtine zaužívaným názvom je centrálna procesná jednotka – Central Processing Unit – CPU. Ak je špecializovaný procesor pomocným procesorom univerzálneho procesora, zvyčajne nesie názov koprocesor. Hoci centrálny (univerzálny) procesor možno vyhotoviť ako skladačku z rôznych obvodov, dnes sa takmer výlučne používa technológia mikročipu – kedy sa špeciálnymi metódami vytvorí celý procesor na jedinej kremíkovej doštičke. Jednotlivé kombinačné i sekvenčné obvody sú také malé, že ich nevidieť ani pod lupou. Pre tato vyrobený procesor sa vžil názov mikroprocesor. Mikroprocesor je procesor vytvorený technológiou s extrémne vysokou hustotou polovodičových prvkov (napríklad tranzistorov) na jednom čipe. CPU podľa programu uloženého v operačnej pamäti vykonáva strojové inštrukcie a riadi činnosť celého počítača. V našom texte sa zaoberáme reálnym režimom mikroprocesora Intel Pentium, kedy napodobňuje starý 16 bitový mikroprocesor Intel APX 8086 a je s ním plne kompatibilný. Intel 8086 mal dve jednotky – BIU a EU. Zbernicová jednotka BIU (Bus Interface Unit) bola časťou, ktorá mala na starosti prístup na zbernicu, vyberala inštrukcie z operačnej pamäte a ukladala ich do vnútornej fronty inštrukcií nachádzajúcej sa priamo v mikroprocesore. Vykonávacia jednotka EU (Execution Unit) už len vyberala inštrukcie z vnútornej fronty inštrukcií a nezdržiavala sa tak ich výberom z operačnej pamäte. Tým sa výkon procesora zvyšoval. Pokým EU vykonávala inštrukciu, BIU čítala ďalšie inštrukcie do fronty. Túto spoluprácu narúšala a dodnes narúša iba inštrukcia skoku, kedy musí BIU frontu vyprázdniť a začať ju znovu plniť inštrukciami počnúc novou adresou – adresou, na ktorú ukazuje inštrukcia skoku.
strana
5
Procesor, inštrukčné a zbernicové cykly, I/O, prerušenia, DMA, VP, BIOS apod.
Registre Register je extrémne rýchla pamäťová bunka nachádzajúca sa priamo v procesore. Jej obsah je neustále prístupný pre inštrukcie. Používa sa ako zdroj dát počas výpočtov v procesore. Akýkoľvek procesor dokáže vykonávať výpočty iba s obsahmi registrov. Môže mať v inštrukčnej sade aj inštrukcie pre výpočty s premennými nachádzajúcimi sa v operačnej pamäti, no aj tieto premenné si musí pred výpočtom skopírovať aspoň do nejakého „tajného“ registra. Registre slúžia na rýchle ukladanie medzivýsledkov, adries alebo často používaných hodnôt. Majú veľmi krátku dobu prístupu, avšak je ich málo. Ich vhodným použitím možno znížiť dobu výpočtu programov, preto dobré prekladače počítačových jazykov disponujú optimalizátormi kódu optimalizujúcimi okrem iného aj využitie registrov pre intenzívne využívané premenné. Špeciálnym registrom je strádač, tzv. akumulátor. Niektoré inštrukcie niektorých procesorov pre svoju prácu používajú dáta iba z akumulátora, napríklad pri násobení musí byť jeden z operandov uložený v akumulátore alebo výsledok operácie zásadne ukladajú iba do akumulátora. Iné procesory (Intel) majú univerzálnejšie registre a pre väčšinu inštrukcií je nepodstatné, v ktorom registri sa nachádzajú ich operandy.
Aritmeticko – logická jednotka ALU – aritmeticko-logická jednotka ako súčasť (mikro)procesora vykonáva aritmetické (+, -, *, /) a logické operácie (súčet, súčin, negácia). Požadované operandy pre ALU dodáva riadiaca jednotka – radič inštrukcií. Všetky aritmetické operácie možno redukovať na posunutie, vytvorenie doplnku a sčítanie. Odčítanie je súčet doplnku kladného čísla, násobenie je opakované sčítavanie a delenie je opakované odčítavanie... Základnými operačnými prvkami ALU sú binárne sčítačky a negátory. Operácie sa môžu vykonávať sériovo a paralelne. Sériová organizácia vystačuje s jednou sčítačkou. Paralelné metódy sú rýchlejšie, ale vyžadujú veľký počet zhodných súčastí. Riadiaca jednotka dodáva ALU riadiace signály potrebné na správne vykonanie aritmetických operácií. V riadiacej jednotke bývajú implementované algoritmy násobenia a delenia. (Napríklad pomocou mikrokódu.) Riadiaci obvod operácií dozerá na správny priebeh operácií vykonávaných radičom. Do stavového registra zapisujú obvody kontrolujúce, či výpočtové operácie prebehli správne, alebo či poruchy neznehodnotili výsledok (kontrolný bit, prekročenie rozsahu, prerušenie).
Inštrukčný (strojový) cyklus Pojmom inštrukčný (resp. strojový) cyklus označujeme postupnosť činností riadiacej jednotky, ktorá sa pri spracovaní inštrukcií neustále opakuje (kým sa neobjaví inštrukcia STOP). Strojový cyklus je postupnosť niekoľkých taktov. Čas, ktorý procesor potrebuje na jeden prechod inštrukčným cyklom sa nazýva doba cyklu. Je to jedno z kritérií pri hodnotení pracovnej rýchlosti procesora. Uvedieme si sedemtaktový cyklus. (Možností je mnoho.) 1. Výber inštrukcie z operačnej pamäte (alebo z VP), 2. dekódovanie inštrukcie pomocou logických obvodov, 3. generovanie adresy operandu inštrukcie, 4. výber operandu inštrukcie z operačnej pamäte (alebo z VP), 5. vykonanie inštrukcie operačnou jednotkou procesora, 6. uloženie výsledku inštrukcie do registra alebo do operačnej pamäte resp. do VP, 7. inkrementácia (zvýšenie hodnoty) IP o správny počet bajtov. Aby sme vedeli, ktorá inštrukcia sa má vykonať, musíme mať register, v ktorom bude uchovaná adresa nasledujúcej inštrukcie. Taký register sa volá PC (Program Counter – programové počítadlo) alebo častejšie (napríklad u Intelu) IP (Instruction Pointer, ukazovateľ na inštrukcie progstrana
6
Procesor, inštrukčné a zbernicové cykly, I/O, prerušenia, DMA, VP, BIOS apod.
ramu). IP obsahuje adresu inštrukcie, ktorá sa má vykonať ako nasledujúca. Presnejšie povedané, IP môže byť definovaný aj tak, že ukazuje na inštrukciu, ktorá sa práve vykonáva. Takto je to v našom jednoduchom opise nezreťazeného strojového cyklu procesora, kedy sa ukazovateľ IP nastavuje na ďalšiu inštrukciu až v siedmom takte. 1. fáza FI - Fetch instruction (výber inštrukcie) – v jedinom strojovom cykle procesor načíta operačný kód (jeho adresa je v PC, t.j. hodnota sa nachádza na adrese v pamäti, ktorú sme získali z PC) do IR (inštrukčný register uchovávajúci operačný kód). 2. fáza DI - Dekódovanie inštrukcie – spočíva v tom, že musíme zistiť o akú inštrukciu ide. Realizuje sa logickou funkciou, pomocou logických obvodov. Na základe operačného kódu sa riadiaca jednotka procesora rozhodne, čo bude operačná jednotka procesora robiť ďalej. Pre každú inštrukciu môže mať procesor pripravenú celú postupnosť mikroinštrukcií. Na základe IR logické obvody dekódera vypočítajú vstupnú hodnotu do registra MIC. Tým sa určí adresa prvej mikroinštrukcie potrebnej na vykonanie požadovanej strojovej inštrukcie. Mikroinštrukcie sú uložené v špeciálnej pamäti typu ROM priamo v obvodoch procesora. 3. a 4. fáza je FD - Fetch Data (Generovanie adresy a výber operandov) – podľa „prefixov“ (ak ich procesor umožňuje používať) a operačného kódu strojovej inštrukcie jednotka MMU (Memory Management Unit) vypočíta skutočnú adresu v operačnej pamäti, kde sa operandy inštrukcie nachádzajú. Po vygenerovaní adresy operandov procesor načíta dáta (operandy) potrebné k vykonaniu inštrukcie. Samozrejme dáta sa môžu načítať aj z IVPD (dátovej vnútornej vyrovnávacej pamäte nachádzajúcej sa priamo v procesore) alebo z EVP (externej vyrovnávacej pamäte), ak tam sú. O to sa už ale nestará priamo procesor, lež skôr jeho pomocné obvody. 5. fáza EI - Execution (vykonanie) – strojová inštrukcia sa pomocou logických obvodov a postupnosti mikroinštrukcií vykoná. Môže trvať mnoho strojových3 taktov, závisí to od typu operácie a počtu operandov. 6. fáza WD - Write data (zápis výsledku) – uloží výsledky do operačnej pamäte alebo do IVP či do EVP. Závisí od inštrukcie, fáza sa môže aj preskočiť. 7. Inkrementácia IP. Pri jednoduchom použití - bez zreťazenia - sa IP inkrementuje o toľko bajtov, koľko zaberá inštrukcia aj s prípadnými prefixami, teda o veľkosť dokončenej inštrukcie v bajtoch. Pri zreťazení je situácia komplikovanejšia. TP
PT
K inštrukčnému cyklu je potrebné dodať, že tretia a štvrtá fáza sa niekedy spájajú do jednej. Siedma fáza už nie je samostatná, pri zreťazenom vykonávaní inštrukcií je práca s ňou trochu komplikovaná. Preto sa často neuvažuje v samostatnom takte. Procesor nemusí pri spracovaní každej strojovej inštrukcie využívať všetky takty. Príkladom môže byť jednoduchá inštrukcia skoku tak veľmi potrebná pre realizáciu cyklov ale aj obyčajných rozhodovaní typu: AK PLATÍ X TAK ROB Y INAK ROB Z Skok na inštrukciu v programe znamená jednoducho nastavenie registra IP na adresu danej inštrukcie v operačnej pamäti. Inštrukcia skoku zväčša nepotrebuje vyberať operandy z operačnej pamäte, lebo adresa, na ktorú sa odovzdáva riadenie, môže byť zakódovaná priamo v operačnom kóde inštrukcie. Preto sa pri spracovaní inštrukcie skoku fáza FD môže mnohokrát preskočiť. Fáza EI (vykonanie inštrukcie) iba pozmení register IP v jedinom strojovom takte. Fáza WD tu nemá zmysel. Nijaký výsledok pri vykonaní inštrukcie nevznikol a nemáme čo zapisovať. Sied3
Pod strojom tu rozumieme procesor. Správne označenie procesora je procesorová alebo procesná jednotka počítača. TP
PT
strana
7
Procesor, inštrukčné a zbernicové cykly, I/O, prerušenia, DMA, VP, BIOS apod.
ma fáza inštrukčného cyklu sa dokonca vykonať nesmie, inak by sa nežiadúcim spôsobom pozmenilo IP. ☺ Časovo najnáročnejšou býva u väčšiny inštrukcií fáza EI. Vykonanie zložitej inštrukcie u procesorov typu CISC, t.j. u procesorov využívajúcich technológiu mikroprogramovania, môže byť zdĺhavé, pretože mnohé funkcie sa pri výrobe „nedrôtujú,“ nevykonávajú ich logické obvody. Vykonáva ich mikroprogramová riadiaca jednotka interpretujúca mikroprogram pozostávajúci zo série mikroinštrukcií využívajúcich činnosť jednoduchých logických obvodov procesora. Napríklad násobenie môže byť vytvorené pomocou mikroprogramu využívajúceho logické obvody jednoduchej sčítačky. Potom (v slabom prevedení) môže byť potrebné realizovať funkciu sčítania pre každý bit zvlášť (ako keď Vy násobíte na papieri), čo znamená, že strojová inštrukcia násobenia sa bude u 32 bitového procesora vykonávať minimálne 32 taktov. (RISC zvládne jej vykonanie za jediný takt.) Aj tu platí staré porekadlo, že menej je niekedy viac. Oproti procesoru typu CISC zvládne procesor typu RISC síce veľmi málo inštrukcií, ale vykonáva ich mimoriadne rýchlo. Zložitejšie inštrukcie sa dajú vyskladať z jednoduchších.
Zreťazenie Prvotné procesory pracovali tak, že po vykonaní strojového cyklu začali vykonávať ďalší strojový cyklus. Výkonnostný skok (napríklad u Intelu z procesora 8086 na 80286) priniesla myšlienka, že keď sa fázy strojového cyklu rozložia na bloky (samostatné moduly), tak v každom strojovom cykle je jeden blok využitý iba v jednom takte a v ďalších šiestich nepracuje. Ak budeme inštrukcie „vkladať“ do procesora „po taktoch“, tak sa nič nestane, pretože blok je v nasledujúcom takte vždy voľný. Zvýšenie výrobnej ceny je minimálne, ale získame procesor so zreťazenou architektúrou – akési kvázi-paralelné spracovanie inštrukcií (ST je strojový takt): Inštrukcia 1: ST1 Inštrukcia 2: Inštrukcia 3: Časové takty: T1
ST2 ST1 T2
ST3 ST2 ST1 T3
ST4 ST3 ST2 T4
ST5 ST4 ST3 T5
ST6 ST5 ST4 T6
ST7 ST6 ST5 T7
ST7 ST6 T8
ST7 T9
Zreťazený inštrukčný cyklus u Pentia firmy Intel má 5 fáz PF D1 D2 EX WB
Prefetch Instruction Decode Address Generate Execute Write Back
Výber inštrukcie Dekódovanie inštrukcie Generovanie adresy Vykonanie (výber dát, vykonanie inštrukcie a zápis výsledku) Dokončenie inštrukcie ☺
Pri dokončovaní inštrukcie sa napríklad nastavujú inštrukciou nastavované bity registra FLAG. Pre urýchlenie činnosti mikroprocesora Pentium sú k dispozícii dva inštrukčné vykonávacie fronty, u (univerzálny) a v (doplnkový). Keď front u začne vykonávať inštrukciu, front v začne vykonávať nasledujúcu inštrukciu, ak je jednoduchá (RISC-ovská) a ak nezávisí na výsledku predošlej inštrukcie. Zápis výsledku môžu uskutočniť súčasne vďaka malým pomocným zápisovým buffrom, z ktorých sa (len čo je to možné) výsledky zapisujú do dátovej IVP. IVP je súčasťou procesora a je potrebná k realizácii kombinácií dvoch zreťazených frontov. Externá VP – EVP – býva označovaná ako L2 cache, označenie L1 cache výrobcovia používajú pre IVP. EVP má výrazne väčšiu kapacitu, ako IVP a nebýva rozdelená na dátovú a inštrukčnú časť. Nachádza sa ešte pred lokálnou zbernicou, procesor je na ňu napojený priamo. IVP je súčasťou procesora – sú to bloky logických obvodov vo vnútri procesora. Intel v súčasnosti vykonáva pokusy ešte aj s vyrovnávacou pamäťou tretej úrovne (L3 cache). Podľa mojich predpokladov by však jej kapacita mala byť aspoň dvakrát väčšia, než je kapacita EVP, aby jej prítomnosť v počítačovej zostave strana
8
Procesor, inštrukčné a zbernicové cykly, I/O, prerušenia, DMA, VP, BIOS apod.
vôbec dávala zmysel. Inak sa takéto riešenie vypláca iba v určitých zriedkavých počítačových zostavách – napríklad vo výkonnej viacprocesorovej zostave. Mikroprogramovanie je programovanie mikroinštrukcií uložených v špeciálnej pamäti procesora. Táto pamäť je súčasťou procesora typu CISC. Uloženie mikroprogramu do špeciálnej pamäte v procesore sa vykoná priamo pri výrobe procesora. Existujú aj procesory, u ktorých je vyhradená časť operačného kódu, ktorého mikroinštrukcie si môže naprogramovať priamo používateľ. Použitie špeciálnych mikroinštrukcií totiž môže výrazne urýchliť niektoré aplikácie. Dnes je však už takýto prístup ojedinelý, pretože z univerzálneho procesora robí čosi iné. Sú aj procesory, ktorým možno vymeniť všetky mikroinštrukcie. Taký procesor dokáže na tejto nízkej úrovni mikroprogramu emulovať iný procesor, t.j. „správať sa“ ako emulovaný procesor. Emuláciu je možné zariadiť aj na vyššej, softvérovej úrovni, bude však výrazne pomalšia. Robí sa to často, napríklad interpretovaný programovací jazyk Java sa preloží pre virtuálny počítač a ten je softvérovo emulovaný pomocou Java Virtual Machine. Mikroinštrukcia obsahuje údaje, ktoré bity sa z ktorého registra zoberú a ako s nimi naložiť. Mikroprogramová riadiaca jednotka realizuje inštrukcie strojového jazyka počítača (procesora) pomocou postupností elementárnych mikrooperácií na základe mikroinštrukcií. Operandmi sú bity registrov, elementárnymi mikroinštrukciami sú podmienené a nepodmienené skoky a signály pre ALU a pamäť, ktoré sú spojené s riadiacou jednotkou. Tak ako výpočtové zariadenie spracúva algoritmy ako programy, vykonáva mikroprogramová riadiaca jednotka inštrukcie programov ako mikroprogramy – postupnosti jednoduchých mikroinštrukcií. Pozostáva z častí: čítač mikroinštrukcí, adresový dekóder mikroinštrukcií, podmienkové hradlo, matica adries mikroinštrukcií a matica (pamäť) mikroinštrukcií. Mikroprogram obsahuje postupnosť mikroinštrukcií, ktoré majú vykonať inštrukciu. Sú dve tendencie výroby procesorov: 1. Aby procesor implementoval všetky možné požadované inštrukcie. Taký typ procesora sa nazýva CISC – Complete Instruction Set Computer (napríklad Intel Pentium rozpoznáva cca 800 základných inštrukcií, ak berieme do úvahy argumenty rozličného typu). 2. Aby inštrukcií bolo málo, ale aby sa vykonávali rýchlo – namiesto mikrokódu ich vykonajú rýchle logické obvody. Taký procesor sa nazýva procesor s redukovanou inštrukčnou množinou – RISC – Reduced Instruction Set Computer. Takéto procesory sú na počudovanie rýchle už pri nízkych frekvenciách a sú schopné dobre využiť zreťazenie. Každý moderný procesor (Pentium IV) má jadro pracujúce na princípe RISC. Aby na ňom mohli bežať staré programy, jadro má nadstavbu, ktorá zložité strojové inštrukcie transformuje (prekladá) na jednoduchšie inštrukcie, ktorým rozumie jadro procesora.
Strojová inštrukcia a jej operandy Strojová inštrukcia je základný prvok programu. Je najmenšou jednotkou, ktorá sa mimo procesora ďalej nerozkladá a ktorá udáva jeden krok práce procesora. (Rozkladá sa len v procesore na úrovni mikroprogramu na jednotlivé mikroinštrukcie.) Strojová inštrukcia je postupnosť čísel pozostávajúca z operačného kódu (čo sa má urobiť) a z operandov (argumentov), ktorých počet závisí na konkrétnej operácii. Operandy môžu byť rôzneho druhu (podľa typu procesora a adresovacieho režimu) podľa toho, odkiaľ sa operandy vyberajú (register, pamäť). Príklady inštrukcií: ADD (sčítanie) potrebuje 2 operandy, INC (increment, zvyšovanie o 1) potrebuje 1 operand, NOP (nemá sa nič robiť) nepotrebuje operand. Pojem inštrukcia sa väčšinou používa iba u strojovo orientovaných jazykov (Assembler). V prípade vyšších programovacích jazykov radšej hovoríme o elementárnych príkazoch. Vykonanie každej inštrukcie ovplyvní stav výpočtového zariadenia. Strojová inštrukcia obsahuje príkaz na vykonanie operácie, odkaz na operandy zadanej operácie, odkaz na nasledustrana
9
Procesor, inštrukčné a zbernicové cykly, I/O, prerušenia, DMA, VP, BIOS apod.
júcu inštrukciu, ktorou má program pokračovať (u príkazov skoku), prípadne môže ešte obsahovať pomocné informácie.
Režimy adresácie Adresovací režim je ukrytý v operačnom kóde inštrukcie. Udáva, akým spôsobom sa majú používať argumenty. Opíšeme si tu najčastejšie režimy. 1. Register mode je priama (direct) práca s registrom, napríklad ADD R2, R3 – pripočíta obsah z registra R3 k registru R2 a výsledok umiestni do registra R2. 2. Register indirect je nepriama práca s registrom, napríklad ADD R2, (R3) – v registri R3 je umiestnená adresa bunky operačnej pamäte, kde sa nachádza hodnota, ktorá sa ma pripočítať k R2. 3. Register decrement (increment), napr. ADD R2, R3+ vykoná sčítanie a automaticky inkrementuje R3. 4. Immediate mode – bezprostredný, priamy operand, ADD R2, 10 – priamo sa pripočíta hodnota 10 k R2. Hodnota je súčasťou operačného kódu inštrukcie. 5. Priame adresovanie – ADD R2, (10)– pripočítame to, čo sa nachádza na adrese 10 v operačnej pamäti. 6. Nepriame adresovanie ADD R2, @(10) – na adrese 10 v pamäti je uložená ďalšia adresa, na ktorej je to, čo máme pripočítať. 7. Indexové adresovanie – ADD R2, (R3+10) – možno použiť napríklad pre prácu s poliami... Intel 8086 (ako dobrý predstaviteľ procesorov typu CISC) umožňuje ešte komplikovanejšie adresovanie, ktoré je možné využiť pri rýchlom prístupe k poliam zoznamov. ☺
Charakteristické typy strojových inštrukcií Pozor, nejde o mikroinštrukcie (konkrétne príklady sú zväčša od Intelu). 1. Inštrukcie prenosu. Umožňujú premiestniť a dočasne uložiť medzivýsledok do pamäte alebo do akumulátora. LOAD - z pamäte do procesora, STORE - z procesora do pamäte (MOV AXkam, (1000)-čo uložiť). Zaberajú 70-80% programu. 2. Aritmetické inštrukcie – vykonávanie základných aritmetických operácií. ADD sčítanie, SUBB odčítanie, NEG negácia, INC inkrementácia, DEC dekrementácia, MUL celočíselné násobenie, DIV celočíselné delenie. 3. Logické inštrukcie – binárna logika. AND súčin, XOR antivalencia, OR logický súčet, NOT negácia. Napríklad AND AX, 5 Keď je v AX číslo 0000000001101110 0000000000000101 0000000000000100 → výsledok sa uloží opäť do AX (akumulátor!) 4. Inštrukcie porovnávania – používame pri práci s príznakovým registrom. TST (napr. AX) testovanie registra (či je 0 alebo 1), nastaví stavový (nazývaný tiež príznakový) register FLAG podľa toho, čo je v AX. Inštrukcia CMP AX, BX → určí, ktorá číselná hodnota uložená v registroch je väčšia. V skutočnosti vykoná inštrukciu AX-BX, avšak výsledok nikam nezapisuje, len na jeho základe nastaví príznakový register. 5. Inštrukcie posunu (rotácie) – ROL (ROR) – rotácia obsahu registra vľavo (vpravo) o 1 bit, SHL (SHR) – posun bitov vľavo (vpravo) a na voľné miesto pridáme 0. SAL, SAR – aritmetický posun (berie do úvahy záporné čísla). 6. Inštrukcie súvisiace s riadením (inštrukcie riadenia smeru behu programu) – nepodmienené skoky. Napríklad JMP 4000 nastaví IP na adresu 4000, teda od tejto adresy bude program U
U
U
U
U
U
U
U
U
U
U
U
U
strana
10
Procesor, inštrukčné a zbernicové cykly, I/O, prerušenia, DMA, VP, BIOS apod.
pokračovať ďalej, JMP ±4000 – o 4000 sa vzdiali (+) či priblíži (-) oproti súčasnej adrese. Podmienené skoky JC ak C=1, skok sa vykoná. Naopak JNC skočí, ak C≠1. 8. Inštrukcie zmeny riadenia volaním procedúry – CALL adresa návratu sa ukladá do zásobníka. 9. Inštrukcia zmeny riadenia pomocou softwarového prerušenia – využíva tabuľky vektorov prerušení (programové využitie volania funkcií operačného systému). INT 15 – číslo prerušenia (číslo 15 je tu náhodou, PC vie využiť 256 prerušení). IRET – návrat z prerušenia. 10. Iné inštrukcie NOP – procesor počas nej nerobí nič. Používa sa v špeciálnych prípadoch, napríklad ak sa na niečo čaká, ak nik s počítačom nepracuje apod. Strojová inštrukcia HALT pozastaví procesor až do asynchrónneho prerušenia nejakým zariadením. Využitie nachádza napríklad pri šetrení energiou alebo pri čakaní na dokončenie operácie nejakého zariadenia. Iné inštrukcie nastavujú napríklad stavový register, napríklad CLS nuluje príznakový register, STI povolí externé maskovateľné prerušenia, CLI zakáže externé maskovateľné prerušenia, STC nastavuje bity v príznakovom (stavovom) registri. Jestvujú aj inštrukcie, po ktorých vykonaní procesor vracia v niektorom registri svoj typ a vlastnosti. Používajú ich počítačové hry na otestovanie typu procesora, aby do počítača vedeli nainštalovať program preložený pre správny procesor. Nainštalovanie programu preloženého napríklad iba pre procesor Pentium neumožňuje využívať inštrukcie MMX apod. U
U
U
U
U
U
Registre u mikroprocesorov Intel 8086 a vyšších 1. Registre na vykonávanie a riadenie inštrukcií a) Všeobecné registre: U Intelu sú pomerne univerzálne. Iba niektoré inštrukcie (napríklad automatický cyklus) očakávajú údaje v určitých registroch. AX je akumulátor. EAX je ten istý, ale celý, t.j. 32 bitový, AX je len 16 bitový kvôli kompatibilite zdola. Rozšírené 32 bitové verzie, v Assembleri zapisované s predponou E, existujú temer ku všetkým 16 bitovým registrom pôvodnej 8086 počnúc procesormi Intel 80386 a vyšších, teda aj Pentií. BX je bázový register, CX je počítadlo (counter, univerzálny register, ale určité inštrukcie v ňom uložené číslo inkrementujú resp. dekrementujú), DX je údajový register (data, pre zápis hodnôt s ktorými pracujeme, inak univerzálny). b) Indexové a ukazateľové registre: SI je zdrojový indexový register, DI je cieľový indexový register. Obidva registre sa používajú na adresovanie dát pri ich kopírovaní v operačnej pamäti pomocou špeciálnych inštrukcií. Výhodou takých inštrukcií je, že po skopírovaní každého bajtu sa obsahy týchto registrov automaticky inkrementujú o 1. (Môžu sa aj automaticky dekrementovať, ak sa kopíruje od vyšších adries smerom k nižším. Smer kopírovania sa nastavuje v stavovom registri.) Inak sú oba registre univerzálne, podobne ako AX, BX, CX a DX. Dobré prekladače zdrojových kódov sem ukladajú intenzívne používané premenné, napríklad v príkaze cyklu for uloží prekladač jazyka C indexovaciu premennú cyklu do SI. Naopak, v cykle while sa premenná ukladá do operačnej pamäte, preto cyklus for býva rýchlejší... SP je stack pointer, t.j. ukazovateľ položiek v zásobníku. Obsahuje adresu poslednej obsadenej položky zásobníka. Hovoríme tiež, že ukazuje na vrchol zásobníka. Lenže zásobník si procesor vytvára v operačnej pamäti, pričom zväčša dodržiava jedno špecifikum – plní ho odhora nadol, od vyšších adries smerom k nižším. Preto je jeho vrchol dole. ☺ BP je tzv. base pointer, slúži na adresáciu parametrov a lokálnych premenných procedúry. Inak sú všetky doteraz uvedené registre univerzálne. IP (PC) je ukazovateľ programu inštrukcií.
2. Registre spojenia so zbernicou – segmentové registre. Na adresáciu segmentov dát používame sadu segmentových registrov – segmentový register programového kódu CS (code segment), segmentový register dát programu DS (data segment), zásobníkový SS (stack seg-
strana
11
Procesor, inštrukčné a zbernicové cykly, I/O, prerušenia, DMA, VP, BIOS apod.
ment), špeciálny ES (extra segment) používaný napríklad pri kopírovaní blokov dát, a pomocné segmentové registre FS a GS, ktoré boli pridané od mikroprocesora 80386.
3. PSN – stavové slovo je uložené v stavovom registri – FLAGS. Obsahuje aspoň tieto bity: OF (Overflow Flag) – príznak pretečenia sa nastavuje, ak počas výpočtu došlo k aritmetickému preplneniu, t.j. výsledok sa nezmestí do registra. DF (Direction Flag) udáva, ktorým smerom sa bude pamäť kopírovať pri špeciálnych inštrukciách na kopírovanie blokov pamäte. Sú to inštrukcie na spracovanie reťazcov. Ak je nastavený, po skopírovaní položky sa obsah registrov SI a DI znižuje, teda sa kopíruje zhora nadol. Inak sa obsah SI a DI inkrementuje a kopírovanie prebieha zdola nahor. Smer kopírovania je dôležitý napríklad pri bublinovom triedení v rámci jediného poľa, teda ak sa zdrojová a cieľová oblasť pamäte prekrýva. Inak na ňom zväčša nezáleží. IF (Interrupt Enable Flag) – príznak povoľujúci externé prerušenia. TF (Trap Flag) – krokovací príznak sa používa pre účely ladenia. Po každej vykonanej inštrukcii procesor vyvolá prerušenie INT 1. SF (Sign Flag) – príznak znamienka výsledku. Je nastavený na 1, ak bol výsledok operácie záporný. Používame doplnkový kód, takže je to kópia najvyššieho bitu výsledku. ZF (Zero Flag) – príznak nuly sa nastavuje, ak bol výsledok operácie nulový. AF (Auxiliary Flag) – príznak pomocného prenosu sa nastaví, ak bol prenos z 3. do 4. bitu. Používa sa v BCD aritmetike, kedy sú čísla kódované ako celé desiatkové čísla. PF (Parity Flag) – nastaví sa, ak dolných 8 bitov výsledku má párny počet jedničiek. Neznamená to, že číslo je párne! (Binárne kódované párne celé číslo rozpoznáme tak, že jeho najnižší bit je 0.) CF (Carry Flag) – nastal prenos z najvyššieho bytu. Používa sa pri niektorých inštrukciách posunu a rotácie. Registre uvedené v 1, 2 a 3 spolu tvoria programový model procesora. Stav procesora je daný bitmi príznakového registra. Pentium má príznakových registrov slušný počet a súvisia s funkciami chráneného režimu.
Cykly Assembler je programovací jazyk pracujúci na úrovni strojového kódu, ale vyhneme sa v ňom priamemu zápisu operačných kódov číslom. Preto sa nazýva aj jazykom symbolických adries. V strojovom kóde nejestvujú vysokoúrovňové cykly ako ich poznáme napríklad z jazyka Pascal. Jediná známa inštrukcia je obdoba GOTO – inštrukcia skoku (môže mať skratku JMP od slova jump, t.j. skoč). Príklad cyklu FOR i = 1 TO 10: ; Do 16 bitového registra CX uložíme číslo 1 ; (keby bol register 32 bitový, názov by bol ECX). ; Tu bude nejaké telo cyklu, podľa toho, čo sa má v cykle vykonávať. ; Inkrementujeme CX – zvýšime číslo v ňom uložené o 1. ; CX tu slúži na počítanie cyklov – ako indexovacia premenná u cyklu for. CMP CX, 10 ; Porovnáme CX s číslom 10. Dá sa použiť aj iná aritmetická inštrukcia, ; napríklad inštrukcia odčítania – ide nám tu len o nastavenie ; stavového registra mikroprocesora pre nasledujúcu inštrukciu. JNZ Skok ; Porovnaním sa v predošlej inštrukcii nastavil bit ZF na 1 v stavovom ; registri, ak v CX bola 10. Na návestie sa teraz skáče, ak CX–10 ≠ 0. ; Inak sa cyklus opúšťa.
MOV CX, 1 Skok: ... INC CX
strana
12
Procesor, inštrukčné a zbernicové cykly, I/O, prerušenia, DMA, VP, BIOS apod.
Odovzdávanie parametrov procedúram Parametre procedúram odovzdávame v registroch alebo ich uložíme na zásobník pred zavolaním funkcie. Lokálne premenné si zasa funkcia vytvára na zásobníku po tom, ako ju zavoláme. Vo vyšších jazykoch zväčša rozlišujeme procedúry (nevracajú hodnotu) a funkcie, ktoré hodnotu vracajú. V assembleri poznáme iba podprogramy, ale nazývame ich procedúry. ☺ Procedúra je v assembleri časť kódu začínajúca návestím a končiaca inštrukciou RET. Procedúra nemôže vracať hodnoty cez zásobník, ale môže ich ponechať v registroch. Takto môžu procedúry v assembleri, na rozdiel od procedúr vo vyšších jazykoch, vrátiť viac ako jednu hodnotu. Procedúru zavoláme inštrukciou CALL Meno_navestia za návestie pritom prekladač assembleru dosadí skutočnú hodnotu offsetu danej časti kódu – v prípade kódového segmentu – alebo skutočnú hodnotu offsetu dát u premenných. Potom píšeme Premenna1 a Premmenna2 namiesto konkrétneho offsetu v dátovom segmente, pričom offset by bol napríklad 3213 a 3215. ☺ Príklad ukladania na zásobník: MOV PUSH MOV PUSH CALL
AX, [Parameter1] AX AX, [Parameter2] AX Procedura1
; Za bodkočiarkou sa píše komentár. Procesor dokáže na zásobník ; ukladať iba obsah registrov, preto sú potrebné dva kroky
V hranatých zátvorkách sme prekladaču (tzv. kompilátoru) jazyka symbolických adries Assembler uviedli názvy návestí pred premennými (musia byť definované v dátovom segmente programu). Tieto symbolické adresy parametrov procedúry kompilátor pri preklade zamení za „pravé,“ takže v programe pôjde o priame adresovanie. (Pri opise adresovania sme v predošlom texte uviedli okrúhle, nie hranaté zátvorky, pretože nešlo o konkrétny Assembler procesora 8086.) Keď procesor pri vykonávaní programu v podobe postupnosti inštrukcií narazí na inštrukciu CALL, automaticky uloží návratovú adresu (CS:IP) na zásobník, preto obsah zásobníka bude u 16 bitového režimu vyzerať takto (nezabudnite, že zásobník Intel plní zhora nadol): Adresa SS:SP+6 SS:SP+4 SS:SP+2 SS:SP
Obsah Parameter1 Parameter2 CS IP
CS sa neukladá, ak voláme funkciu z toho istého segmentu. (Čo je väčšina volaní.) Ale to býva vecou Intelu (CISC). Teraz môžeme použiť PUSH BP (pre istotu je nutné si zálohovať obsah všetkých procedúrou používaných registrov, teda tu minimálne registra BP) a inštrukciou MOV BP, SP prekopírovať obsah SP do BP. Od SP odteraz nebudeme závislí, môže sa meniť. BP musíme použiť na uchovanie SP, mohlo by sa stať (a určite sa aj stane), že obsah SP sa zmení volaním napríklad prerušení. BP bude odteraz obsahovať adresu, od ktorej si vieme pričítaním adresovať parametre odovzdané našej procedúre. Odčítaním si zasa vieme adresovať lokálne premenné, ak ich vytvoríme pomocou PUSH tak, ako sme vytvárali parametre procedúry. Z procedúry sa vraciame inštrukciou RET, ktorá „vyzdvihne“ zo zásobníka obsahy registrov IP a CS, takže nadradená procedúra (resp. hlavný program) môže pokračovať od inštrukcie nasledujúcej za miestom, v ktorom inštrukciu CALL vyvolala. Je ale treba upraviť obsah SP tak, aby sa strana
13
Procesor, inštrukčné a zbernicové cykly, I/O, prerušenia, DMA, VP, BIOS apod.
Parameter1 a Parameter2 „zabudol,“ inak pomaly preplníme zásobník. Úpravu môže vykonať prekladač Assembleru za nás.
Programovanie Jediný jazyk, ktorému rozumie CPU, je presný jazyk strojových inštrukcií. Podľa typu procesora ich buď pozná len málo a vie ich okamžite a hlavne rýchlo vykonať logickými obvodmi (RISC) alebo ich pozná mnoho, ale väčšinu strojových inštrukcií nevie vykonať priamo. Sú to samozrejme tie zložitejšie. Potrebuje si ich rozložiť na menšie mikroinštrukcie, ktoré už vie spracovať logickými obvodmi. Mikroinštrukcie pre jednu strojovú inštrukciu tvoria mikroprogram. To je v poriadku. Lenže každá mikroinštrukcia si vyžaduje aspoň jeden strojový takt. A tak jediná strojová inštrukcia môže byť preložená na pomerne rozsiahly mikroprogram pozostávajúci z mnohých mikroinštrukcií dohromady trvajúcich mnoho strojových taktov. Naopak, RISC mikroinštrukcie vôbec nemá a tak reaguje v jedinom takte. Preto je CISC principiálne pomalší ako RISC. Procesor dokáže spracovávať program uložený v hlavnej pamäti v podobe postupnosti strojových inštrukcií. Písať aj jednoduché programy v tvare postupnosti strojových inštrukcií je veľmi náročné. Treba poznať operačný kód a spôsob kódovania argumentov každej použitej inštrukcie. Na iný typ počítača sa takýto program vôbec nedá preniesť. Jednou z možností, ako odbremeniť programátora, je pomoc v tvare jazyka symbolických adries – Assemblera. Programátor aj tu potrebuje poznať strojové inštrukcie, ale nemusí vedieť detaily o operačných kódoch. Napíše program, ktorý bude obsahovať symboly inštrukcií a symbolické návestia premenných namiesto skutočných čísel adries v operačnej pamäti. O priradenie skutočných adries sa postará prekladač jazyka symbolických adries – Assembler. Vyššie programovacie jazyky (Algol, Fortran, Gobol, Pascal, C) sa snažia odbremeniť programátora aj od takéhoto predsa len náročného programovania. Programátor sa môže sústrediť viac na riešený problém. Používa názvy premenných a vysokoúrovňové cykly. Takto napísaný program nie je pre počítač použiteľný priamo. Je v tvare tzv. zdrojového textu – textového súboru určeného na preklad. Zdrojový text prekladač daného jazyka preloží do Assembleru. Prekladač Assembleru program preloží do strojového kódu. Tzv. linker spojí vytvorený program so štandardnými knižnicami, pokiaľ sa na funkcie v nich program odvoláva. Práve existencia štandardných knižníc a možnosť vyhnúť sa technickým detailom pri programovaní vo vyšších programovacích jazykoch umožňujú vytvárať prenositeľné programy. Program napísaný vo vyššom programovacom jazyku býva prenositeľný na iný typ počítača, no nie priamo. Iba na úrovni zdrojových textov. Preložený program na inom počítači nepobeží, lebo nízkoúrovňové knižničné funkcie bývajú „šité na mieru“ konkrétnemu počítaču. Navyše, program preložený do spustiteľného tvaru má už operačné kódy očíslované. Číselné kombinácie však na inom type počítača môžu znamenať čosi iné. Jednoducho preto, že operačný kód jeho procesora je odlišný. Prenositeľnosť na úrovni zdrojových textov nebýva dokonalá medzi rôznymi operačnými systémami. Hlavným dôvodom je, že každý operačný systém má sadu vlastných nízkoúrovňových funkcií a prekladač pre operačný systém môže byť vyvíjaný inou osobou „neštandardne.“ Bežné programy bývajú prenositeľné. Zložité programy však treba mierne upravovať. Dokonalú prenositeľnosť zabezpečujú skriptové programovacie jazyky. Princíp je takýto: Napíšeme zdrojový text – tu zväčša nazývaný skript – a ten spustíme tak, že namiesto prekladača spustíme interpretátor programu. Interpretátor priamo počas behu programu prekladá zdrojový text nášho skriptu na postupnosť strojových inštrukcií pre konkrétny typ počítača a jeho konkrétny procesor. Interpretátor tak dokáže vyrovnať rozdiely medzi počítačmi i operačnými systémami. Známymi interpretovanými jazykmi sú Basic, Prolog, Lisp, Perl, TCL/TK. Najlepšie riešeným prenositeľným skriptovacím jazykom je Java. Program v Jave je na konkrétnom počítači preložený do pseudooperačného kódu a takýto program býva rýchlo interpretostrana
14
Procesor, inštrukčné a zbernicové cykly, I/O, prerušenia, DMA, VP, BIOS apod.
vaný interpretátorom, ktorý sa v prípade javy nazýva Java Virtual Machine – virtuálny javovský počítač. To dobre charakterizuje, o čo tu ide. Program sa preloží pre javovský počítač, ktorý ale neexistuje. Java Virtual Machine potom emuluje tento javovský počítač na konkrétnom počítači s jeho volaniami funkcií pre konkrétny operačný systém. To znamená, že prekladá inštrukcie javovského virtuálneho počítača na inštrukcie pre skutočný (tzv. hostiteľský) počítač a vyrovnáva rozdiely vo volaní knižničných funkcií poskytovaných operačným systémom.
Radiče zariadení Radič je čip. Radič je fyzické zariadenie umiestnené na samostatnej doske alebo na hlavnej (tzv. matičnej) doske počítača. Jeho úlohou je spájať s jadrom počítača hardvérové zariadenia a umožňovať ich softvérové ovládanie. (Jadro počítača tvorí CPU a RAM.) Určuje, ktoré zariadenie vykoná ďalšiu akciu. Mení signály tak, aby im zariadenia rozumeli. Každé zariadenie musí mať svoj radič. Radič prostredníctvom portov umožňuje komunikáciu medzi mikroprocesorom a externým zariadením. Fyzicky radičom býva adaptér – slangovo označovaný ako karta, ktorá sa zariadeniu predradzuje. Radič alebo zariadenia majú vlastnú vyrovnávaciu pamäť, označovanú názvami buffer, pamäť zariadenia, vyrovnávacia pamäť, cache apod. Buffer slúži na preklenutie rozdielu medzi rýchlosťou počítača a zariadenia (aby jeden na druhého zbytočne nečakali). Dôležitý je najmä u zariadení, ktoré informácie čítajú či zapisujú po blokoch, nie po bajtoch. Nazývame ich blokové zariadenia. Patrí sem napríklad pevný disk, ktorý údaje na ňom uložené adresuje po blokoch, tzv. sektoroch. Registre radiča môžu mať priradené adresy v operačnej pamäti alebo v adresnom priestore vyhradenom pre I/O. Ten sa nachádza mimo adresného priestoru operačnej pamäte a je prístupný cez inštrukcie IN a OUT (namiesto inštrukcie MOV používanej u operačnej pamäte). Operačný systém pristupuje k radičom cez ich ovládače, čo sú malé programové kódy, ktoré vedia, akým spôsobom treba kódovať a dekódovať dáta vysielané či prijímané na registre zariadenia.
Programové prostriedky pre komunikáciu so zariadeniami Inštrukcie:
IN AX, č.P – čítanie (ak poznáme číslo Portu a význam hodnôt), OUT č.P, AX – zápis na port (teda do registra zariadenia). Prerušenia: Viď kapitolu prerušenia. U
U
U
U
Ovládače Základnou funkciou ovládačov je ovládanie externých zariadení (ovládač je program na ovládanie funkcií radiča zariadenia). Ovládač (driver) sa počas štartovania operačného systému skopíruje z nejakého súboru a vloží sa na príslušné miesto do operačnej pamäte. Vkladá ho tam operačný systém. Prepíše pritom príslušnú položku tabuľky vektorov prerušení tak, aby pri prerušení, ktoré prišlo od príslušného zariadenia, bol vykonaný kód ovládača. Potom môže byť vykonaný aj pôvodný kód (stačí, ak si ovládač pred prepisom zapamätá jeho adresu, ak je to vhodné a nejaký kód na ovládanie zariadenia v operačnej pamäti už bol, napríklad ak už bol zavedený BIOSom. Prepísanie položky v tabuľke vektorov prerušení je jednoduché – operačný systém tam uloží adresu začiatku kódu ovládača. Podľa typu operačného systému a dôležitosti zariadenia sa ovládač väčšinou môže počas behu operačného systému z pamäte vymazať - odinštalovať. Vykonávaná časť ovládača musí byť v pamäti a musí byť prístupná. Keby nebola prístupná, driver sa nemôže použiť. Spomienka na MS-DOS: Súbor IO.SYS (štandardné ovládače zariadení, ako je klávesnica, grafický adaptér), MS-DOS.SYS (služby operačného systému, ktoré je možné volať pomocou prerušení), CONFIG.SYS (popis ďalších ovládačov - kde sa nachádzajú, t.j. odkiaľ ich má operačný systém zaviesť), COMAND.COM resp. WIN.COM – spúšťa operačný systém MS-DOS resp. Windows. strana
15
Procesor, inštrukčné a zbernicové cykly, I/O, prerušenia, DMA, VP, BIOS apod.
Tvorba prenositeľných aplikácií Ovládač umožňuje preklenutie priepasti medzi hardvérom a softvérom. Existujú napríklad tisícky typov tlačiarní. Program (napríklad MS-Word) buď pozná absolútne všetky tlačiarne, alebo tlačí nepriamo – na tzv. virtuálnu tlačiareň. Tú tvorí ovládač konkrétnej tlačiarne, ktorý presne pozná inštrukcie pre danú tlačiareň, aby tlač bola čo najviac podobná výsledku, ktorý požaduje MS-Word...
Komunikácia procesora s operačnou pamäťou Pri čítaní (R) z operačnej pamäte musí procesor nastaviť na adresovej zbernici platnú adresu pamäťovej bunky, z ktorej chce načítať informáciu a musí nastaviť aktuálnu úroveň signálu pre čítanie údajov z operačnej pamäte. Signál musí byť v aktívnej úrovni dostatočne dlhý čas. Po istom čase (doba prístupu resp. odozvy pamäte) pamäť vyšle na údajovú (dátovú) zbernicu DZ platnú informáciu. Pri zápise (W) do operačnej pamäte musí procesor nastaviť na AZ adresu bunky pamäte, do ktorej chce zapisovať a na DZ vyslať platné údaje. Až potom nastaví na aktívnu úroveň signál pre zápis do operačnej pamäte. Je potrebné dodržať istú minimálnu dobu trvania signálu W a zabezpečiť dostatočný predstih údajov, aby nedošlo k chybám pri zápise. V oboch prípadoch zbernicový cyklus pozostáva zo zbernicových taktov zahrňujúcich vyslanie riadiacich signálov, adresy i dát v správnom poradí.
Komunikácia procesora so zariadeniami Vstupno-výstupná brána je register v radiči zariadenia prístupný zo strany zbernice (teda procesora alebo obvodu DMA) i zo strany zariadenia. Zvyčajne ich nazývame portami, čo je slovo prevzaté z angličtiny. Každý port má pridelené číslo. Každé zariadenie má svoj radič obsahujúci aspoň jeden vstupno-výstupný komunikačný port. Na komunikáciu so zariadením pomocou portov procesor používa inštrukcie IN (čítanie) a OUT (zápis). Ak chceme do portu (na port) čosi zapísať (W), tak mikroprocesor nastaví číslo portu na AZ, údaj sa vyšle na DZ, signál R/W sa prepne do polohy W a nastaví sa I/O select. Je to signál určujúci radiču, aby sa pozrel na zbernicu, či sa tam nenachádza číslo jeho portu. Ak áno, dáta si zo zbernice skopíruje do registra portu. Zariadenie vyšle signál Ready. Pri čítaní (R) z portu mikroprocesor nastaví číslo portu na AZ, R/W sa nastaví na R a I/O select=1 (jeden z portov má zareagovať, nie operačná pamäť). Zariadenie na DZ skopíruje obsah daného portu a vyšle signál Ready. Radič príslušného zariadenia obsahuje riadiace porty (určené len na zápis zo strany procesora, riadia činnosť zariadenia), stavové porty (len na čítanie, zistenie stavu zariadenia resp. či zariadenie urobilo to, čo malo) a údajové porty (obojsmerné na prenos a uchovávanie údajov). Radič generuje riadiace a údajové signály pre zariadenie podľa požadovanej operácie. Číslo portu je zariadeniu jednoznačne priradené. Radič sa aktivuje, len ak príde signál I/O select. Porovnaním adresy portu s adresou, ktorú má pridelenú, zistí, či signál nie je určený pre ním obsluhované zariadenie. Mikroprocesor je s vonkajšími zariadeniami spojený prerušovacími linkami – môžu to byť tiež vodiče zbernice.
Prerušenia Keď chceme vedieť, či už v obchode dostali tovar, tak do obchodu zájdeme a pozrieme sa. Kľudne sa však môže stať, že náš výrobok dlhú dobu nedostanú. Potom do obchodu chodíme zbytočne. A naopak, ak ho dostali, ale my do obchodu nechodíme príliš často, možno ho vypredajú skôr, než obchod opätovne navštívime. Ak však máme predavačku za kamarátku, potom nám môže zatelefonovať, len čo dostanú tovar, my prerušíme momentálne vykonávanú činnosť strana
16
Procesor, inštrukčné a zbernicové cykly, I/O, prerušenia, DMA, VP, BIOS apod.
(napríklad pitie piva), rýchlo zabehneme do obchodu, vybavíme, čo sme chceli a čo najrýchlejšie sa k pivu vrátime. ☺ Podobný problém má procesor pri komunikácii s externými zariadeniami. Procesor nevie, či zariadenie už zverenú úlohu vykonalo (napríklad vytlačenie 10 strán textu môže trvať minútu i viac) a má tri možnosti: 1. Môže v nekonečnej slučke čakať na zariadenie. To je hrozné mrhanie výkonom procesora. 2. Môže podchvíľou kontrolovať, či zariadenie už prácu vykonalo. 3. Môže (napríklad po niektorom vodiči systémovej zbernice) dostať od zariadenia signál, že práca je hotová, prerušiť doterajšiu prácu a rýchlo vyriešiť ďalšiu spoluprácu so zariadením. Táto možnosť je najefektívnejšia, dobre využíva výkon procesora i výkon zariadenia. Preto sa aj najčastejšie používa. Hovoríme o prerušovacom systéme resp. o systéme prerušovania práce procesora. Intel u rodiny procesorov 8086+ (až po súčasné Pentium IV) rozlišuje výnimky a prerušenia. Výnimky sú synchrónne prerušenia vykonávania programu vyvolané programátorom – veď prerušenie obsluhuje kód veľmi podobný procedúre – alebo synchrónne hardvérové prerušenia generované procesorom pri pokuse o delenie nulou, o vykonanie neznámej inštrukcie alebo pri nepovolenom prístupe do pamäte. Prerušenia sú asynchrónne hardvérové prerušenia činnosti počítača a generujú ich vonkajšie udalosti, napríklad I/O zariadenia, výpadok prúdu či chyba parity pamäte (porucha operačnej pamäte), ktoré si vyžadujú obsluhu. Výnimky i prerušenia pre zjednodušenie dokopy nazývame len prerušeniami. ☺ MS-DOS, predchodca Windows, poskytoval služby operačného systému tiež pomocou prerušení. Jednoducho používateľ zavolal prerušenie softvérovo, do registra AH vložil číslo požadovanej služby (napríklad MOV AH, 9 pre výpis textu na obrazovku) a zavolal prerušenie inštrukciou INT 21h. Ukladanie do registrov záviselo na type služby. Niektoré služby poskytoval MS-DOS (operačný systém), iné priamo BIOS. V dnešnej dobe sa služby operačného systému (Windows, Linux) aplikáciám poskytujú cez API (aplikačné programové rozhranie) v podobe sady funkcií operačného systému, ktoré používateľská aplikácia môže zavolať. Tieto funkcie poskytuje operačný systém v spolupráci s ovládačmi zariadení. Môže ísť o funkcie typu zistenie presného času, vykreslenie obdĺžnika vo virtuálnom okne pridelenom programu správcom obrazovkovej plochy, prečítanie obsahu súboru apod. Intel rozlišuje tzv. krátky skok, kedy sa adresa inštrukcie, na ktorú skáčeme, zapisuje do IP. A dlhý skok, kedy sa nová adresa ďalšej inštrukcie zapisuje nielen do IP ale meníme aj segment a adresu treba zapísať v tvare segment:offset, teda sa zapisuje do IP i do CS. Prerušenia sú používané vždy ako dlhý skok. V tzv. reálnom režime je tabuľka vektorov prerušení uložená presne od začiatku pamäte (od adresy 0000:0000) a jej položky zaberajú po 4 bajty. Tabuľka vektorov prerušení je tabuľka začiatočných adries malých programových kódov umožňujúcich obsluhu resp. spracovanie prerušenia. Napríklad prerušenie od časovača je obsluhované tak, aby sa okrem iného správnym spôsobom aktualizoval záznam o aktuálnom čase. Pritom na nižšej adrese je uložený dvojbajtový offset, na vyššej dvojbajtový segment adresy, kam sa skáče. Preto hovoríme o tabuľke vektorov prerušení, lebo sa „skáče“ na adresu uvedenú v tejto tabuľke. Keby sme mali v operačnej pamäti rezervované presne vymedzené miesto na kód prerušenia (resp. na ovládač), nemuselo by nám na niektoré zložité obslužné programy stačiť. A naopak, pre jednoduché kódy by bolo veľké rezervované miesto zbytočným mrhaním vzácnou operačnou pamäťou. Takto je to flexibilnejšie, kód môže byť hocikde a jeho veľkosť určuje výrobca operačného systému. Začiatok operačnej pamäte vyzerá u PC takto:
strana
17
Procesor, inštrukčné a zbernicové cykly, I/O, prerušenia, DMA, VP, BIOS apod.
Číslo prerušenia INT 0 INT1
Adresa 0000:0000 0000:0002 0000:0004 0000:0006
čo je tam offset prerušenia 0 segment prerušenia 0 offset prerušenia 1 segment prerušenia 1
Rozlišuje sa 256 rôznych prerušení a výnimiek ( zaberajú 256*4 bajtov = 1 KB RAM). Po prijatí požiadavky o prerušenie procesor dokončí práve vykonávanú inštrukciu (aj keď ide o inštrukciu trvajúcu mnoho strojových taktov, napríklad ak ide o inštrukciu kopírovania veľkého bloku dát) a automaticky vykoná niekoľko akcií: 1. na zásobník (používa sa aj výraz do zásobníka) uloží obsah stavového registra (nazýva sa aj príznakový register) FLAGS, 2. vynulujú sa príznaky IF a TF (zakážu sa ďalšie prerušenia a zakáže sa krokovací režim), 3. do zásobníka sa uloží register CS, (pod uložením registra myslíme skopírovanie jeho obsahu) 4. register CS sa naplní 16 bitovým obsahom z adresy n x 4 + 2, 5. do zásobníka sa uloží register IP ukazujúci na nevykonanú inštrukciu, 6. register IP sa naplní 16 bitovým obsahom adresy n x 4. Externé prerušenie má Intel jedno nemaskovateľné (privedené k procesoru signálom NMI) a maskovateľné prerušenia (signál INTR). Tie zaobstaráva obvod 8259A, ku ktorému je možné priviesť až 8 signálov požiadaviek z externých zariadení. Tieto vstupy označujeme ako IRQ. Čipy 8259A a ich klony, napríklad 8259A-5 sa dajú sa radiť do kaskády, zväčša sa používajú dva – a teda máme 7 + 8 možných prerušení. Maskovateľnosť signálu INTR sa zabezpečuje programovo – akceptovanie žiadosti o prerušenie sa nastavuje indikátorom IF v príznakovom registri (ak IF=1, prerušenia sú povolené), ktorý nastavujú inštrukcie STI (set IF) a CLI (clear IF). Obvod 8259A navyše umožňuje využívať priority prerušení. Ak sa vykonáva prerušenie s určitou prioritou, je zakázané vyvolať prerušenie s rovnakou alebo nižšou prioritou. ☺ Úroveň signálu INTR sa kontroluje na konci každého strojového cyklu. Prijatie žiadosti procesor potvrdí dvoma signálmi INTA. Najprv uloží na zásobník register FLAGS, nuluje IF a TF a generuje prvý signál INTA. V druhom cykle INTA umiestni radič 8259A na dátovú zbernicu slabiku typu prerušenia zodpovedajúcu vonkajšiemu zariadeniu (v podstate je to číslo IRQ, ktoré je u PC zapisované ako číslo prerušenia 8-15 a 112-119). Toto číslo procesor vynásobí štyrmi a uskutoční zámenu CS:IP tak, ako sme uviedli vyššie. Potom sa vykoná skok na obslužnú rutinu volaného podprogramu obsluhujúceho prerušenie. Ten je obsiahnutý v BIOSe (dodaný výrobcom počítača) alebo sa nachádza v pamäti v podobe ovládača zariadenia. Pred návratom z obsluhy prerušenia musí program v registri ISR radiča 8259A vynulovať bit zodpovedajúci obsluhovanému prerušeniu. Uskutoční to zaslaním príkazu EOI (End Of Interrupt) pomocou príkazu OCW2 pre obvod (čip) 8259A. Návrat z obsluhy prerušenia sa vykonáva inštrukciou IRET (interrupt return), ktorá zo zásobníka obnoví registre (v tomto poradí) IP, CS a príznakový register FLAGS. NMI sa spracúva podobne, len sa negenerujú cykly s aktívnym vodičom INTA zbernice, lebo NMI je len jedno. Preto mikroprocesor nepotrebuje vedieť jeho číslo. Pre zaujímavosť uvedieme niektoré prerušenia v reálnom režime 80286+: Prerušenie 0 sa vykoná pri pokuse o delenie nulou. Prerušenie 1 sa vykoná po vykonaní každej inštrukcie, ak je nastavený TF v príznakovom registri. Slúži na krokovanie ladených programov. Prerušenie 2 sa vykoná pri nemaskovateľnom prerušení NMI. Prerušenie 3 sa generuje pri inštrukcii INT 3 a slúži na nastavenie kontrolných bodov (Breakpoints) v ladenom programe. Ladený program je vykonávaný až po inštrukciu, za ktorou strana
18
Procesor, inštrukčné a zbernicové cykly, I/O, prerušenia, DMA, VP, BIOS apod.
je nastavené INT 3. Operačný kód inštrukcie INT 3 má veľkosť len 1 bajt a nemá operandy. Od tohto bodu sa nastaví TF a program bude ďalej už len krokovaný. Prerušenie 4 sa vykoná inštrukciou INTO, ak je nastavený bit v OF, teda ak došlo k pretečeniu pri výpočte.
Priamy prístup do pamäte – DMA Pri prenose dát počas prerušenia sa môže použiť DMA. DMA znamená direct memory access, teda priamy prístup do pamäte. Tento prenos býva rýchlejší ako prenos pomocou CPU. Počet zbernicových taktov, ktoré potrebuje CPU na cyklus procesorového prístupu do operačnej pamäte, je menší než počet zbernicových taktov, ktoré si vyžaduje zbernicový cyklus prenosu dát realizovaný obvodom DMA. Lenže pri prenose pomocou CPU potrebujeme zbernicové cykly dva. Jeden cyklus na prenos zo zariadenia do niektorého registra CPU (cyklus zariadenie-CPU) a druhý na zápis obsahu tohto registra do operačnej pamäte (cyklus CPU-RAM). V minulosti sa na DMA používal obvod 8237A, teraz ho môžu zastúpiť „čipy“ (integrované obvody) základnej dosky (tak isto sú nahrádzané aj 8259A-5 u prerušení). Mikroprocesor a riadiaci obvod DMA sa spoločne delia o tú istú lokálnu zbernicu – v bežnej situácii je od zbernice odpojený DMA obvod. Pri priamom vstupe zase ako keby sa odpojil mikroprocesor. Existujú triky, ako cykly zbernice medzi obvodom DMA a mikroprocesorom prepínať, aby dlhý prenos nepozastavil CPU. Vždy nám ide o čo najlepšie využitie výkonu mikroprocesora. Preto je veľkou chybou, keď mikroprocesor čaká. Pri prenose dát pomocou DMA máme v tomto ohľade u moderných mikroprocesorov výhodu – mikroprocesor si často určitú dobu vystačí s kópiami údajov a inštrukcií umiestnenými vo svojich vyrovnávacích pamätiach. Keďže k nim pristupuje bez používania zbernice, jej odpojenie na krátke chvíle nemusí byť veľkým problémom.. Priebeh DMA prenosu: Po tom, ako niektorý z adaptérov (radičov zberníc či priamo zariadení) vyšle prostredníctvom signálu DRQi žiadosť o prenos dát, radič DMA rozhodne o priorite žiadosti vzhľadom na prípadné ostatné žiadosti a smerom k bloku riadenia zbernice vyšle signál HRQ. Tento obvod zosynchronizuje žiadosť HRQ s hodinami mikroprocesora a ako signál HOLD ju pošle ďalej po riadiacej časti lokálnej zbernice. Mikroprocesor na to zareaguje tak, že dokončí práve prebiehajúci strojový cyklus a bloku riadenia zbernice odpovie. Smerom k radiču DMA začne vysielať signál HLDA oznamujúci, že zbernica bude počas nasledujúceho hodinového cyklu voľná. Podobné signály vyšle smerom k budičom adresovej, dátovej a riadiacej zbernice a tie odpoja mikroprocesor od systémovej zbernice. (Čitateľ vidí, že používam rôznu terminológiu, napríklad lokálnu zbernicu som nazval systémovou a jej časti som nazval samostatnými zbernicami. Dôvod je ten, že s rôznym označovaním sa stretne v rôznej literatúre. Priebeh zbernicového cyklu závisí aj od „veku“ architektúry, preto sa netreba veľmi spoliehať na nejakú knižku opisujúcu napríklad architektúru počítača s procesorom 80286 starú mnoho rokov. Počet zbernicových taktov, z ktorých pozostáva zbernicový cyklus, môže byť rôzny.) Radič na signál HLDA zareaguje vyslaním odpovedajúceho DACKi na zbernicu a to je selektívny signál pre konkrétny žiadajúci adaptér. Ten prestane vysielať signál DRQi. Riadenia prenosu sa teraz ujme obvod DMA a počas niekoľkých hodinových taktov zbernice uskutoční prenos jednej položky údajov. Radič DMA po skončení zbernicového cyklu DMA zhodí žiadosť HRQ a mikroprocesor prestane vysielať aktívne HLDA. Budiče všetkých častí systémovej zbernice opäť pripoja mikroprocesor a začne prebiehať normálny (procesorový) zbernicový cyklus. Všetko menované prebieha pri každom cykle prenosu dát obvodom DMA. Zbernicové cykly procesora sú podľa potreby prekladané cyklami DMA. Prepínanie zbernice medzi procesorom a DMA je však časovo drahé. V minulosti bol u PC neprerušovaný prenos veľkých blokov dát pomocou DMA nezvyklý, preto paradoxne prenos pomocou procesora býval rýchlejší... Existuje však aj možnosť, že sa pomocou DMA prenáša naraz veľký blok dát (maximálne do 64 kB). Vyhneme sa časovo drahému prepínaniu zbernice. Táto možnosť je preferovaná strana
19
Procesor, inštrukčné a zbernicové cykly, I/O, prerušenia, DMA, VP, BIOS apod.
v súčasnosti hlavne u zariadení, ktoré dokážu prenášať dáta tak rýchlo, že nevznikajú prázdne čakacie cykly zbernice. Procesor si často vystačí s VP dlhú dobu (VP = vyrovnávacia pamäť = CACHE) a preto odpojením zbernice od procesora na viac ako jeden zbernicový cyklus zasa až taký veľký pokles výkonu procesora neriskujeme. Moderné BIOSy zapínajú prenos pomocou DMA napríklad pre moderné disky automaticky. Dokonca sa používa režim UDMA – Ultra DMA pre prenos veľmi veľkých blokov dát Takže si treba pamätať, že v súčasnosti býva zvykom používať DMA prenos naraz pre veľký blok dát. V minulosti (ešte pred používaním VP) boli u PC obľúbené prekladané cykly alebo prenos veľkých blokov dát procesorom pomocou inštrukcií pre kopírovanie reťazcov. Avšak procesor nemohol v tom čase robiť nič iné...
Vyrovnávacia pamäť mikroprocesora Pentium Rýchla vyrovnávacia pamäť (VP) procesora sa nachádza medzi mikroprocesorom a operačnou pamäťou. Jej základnou úlohou je preklenúť rozdiel medzi rýchlosťou mikroprocesora a pamäte. Keďže procesor k pamäti pristupuje cez lokálnu zbernicu, no k internej VP (t.j. IVP) procesor pristupuje priamo, je prístup do VP vždy rýchlejší. IVP dokáže reagovať už v nasledujúcom takte, navyše – na rozdiel od operačnej pamäte u PC – umožňuje viacnásobný nezávislý prístup. To znamená, že naraz možno čítať dáta z dátovej VP, zároveň čítať inštrukcie z inštrukčnej VP a zároveň zapisovať výsledok. VP je u Intelu vypracovaná podľa štandardu MESI. Je to asociatívna pamäť, t.j. každý jej riadok sa skladá z troch položiek – adresy, stavových bitov a bloku dát. Blok dát je väčší než 1 Byte. U Pentia je to 32 slabík (bajtov). Obsah VP si možno predstaviť po riadkoch (tabuľka je iba príklad, dĺžka riadku u AMD je 64 bytes): Adresa 0000:0010 0100:0FFA 00FF:0321
Modified 0 0 1
Exclusive 1 0 0
Shared 0 0 0
Invalid 0 1 0
Dátový blok 32 bajov 32 bytes 32 B
MESI protokol: Modified znamená, že položka bola modifikovaná, ale v operačnej pamäti ešte nie je zapísaná. Môže ju mať iba jeden procesor vo viacprocesorovom systéme. Položku označenú ako Exclusive môže mať vo VP len jeden procesor vo viacprocesorovom systéme a nesmie do nej nič zapísať, inak sa zmení na Modified. Položka Shared označuje viacerými procesormi zdieľané dáta. U takto označenej položky musí zápis prebiehať i do hlavnej pamäte. Invalid označuje neplatnú položku (napríklad vieme, že nejaké zariadenie naplní operačnú pamäť dátami pomocou DMA, také dáta asi nebudú korešpondovať s dátami v cache pre určité adresy, preto položky v cache „zneplatníme“). Účinnosť vyrovnávacej pamäte je závislá na tom, ako často sa vykonávajú programy obsahujúce cykly. Našťastie programy bez cyklov temer nejestvujú. Čím viac malých cyklov, tým je VP účinnejšia, pretože netreba pristupovať do operačnej pamäte, ak sa v cykle využívajú tie isté dáta a tie isté inštrukcie. (Inštrukcie sa totižto u počítačov tzv. Princetonskej architektúry tiež vyberajú z operačnej pamäte.) Činnosť VP je jednoduchá – ak sa hľadajú dáta na určitej adrese v operačnej pamäti, najprv sa prehľadajú políčka stĺpca s názvom adresa v dátovej vyrovnávacej pamäti. Ak sa také políčko nájde a dáta v ňom nie sú označené ako neplatné (Invalid je nastavené na hodnotu 0, teda dáta sú valid), tak nastane stav HIT a dáta sa použijú, pričom nebolo potrebné generovať zdĺhavé cykly zbernice na výber dát z operačnej pamäte. Existujú situácie, kedy vyrovnávacia pamäť dát dokonca iba zdržiava výpočet. To sú také programy, ktoré pracujú s obrovským množstvom dát a s každou položkou iba raz. Vtedy nastáva temer vždy iba stav MISS, kedy dáta vo vyrovnávacej pamäti nie sú a je treba generovať cykly zbernice pre výber údajov z operačnej pamäte. Za takých okolností práca s VP mikroprocesor iba zdržiava. Dáta z operačnej pamäte sa okrem zapisovania do registrov procesora zapisujú aj strana
20
Procesor, inštrukčné a zbernicové cykly, I/O, prerušenia, DMA, VP, BIOS apod.
do vyrovnávacej pamäte, ak je v nej miesto. Ak v nej nie je miesto, je potrebné ho urobiť. „Riadok“ vo vyrovnávacej pamäti sa uvoľní tak, že sa jeho obsah zapíše do operačnej pamäte. Na náhrady starých dát novými sa vo vyrovnávacej pamäti procesora využívajú rôzne algoritmy, väčšinou sa „vyhodí“ najstarší alebo najmenej používaný riadok. Alebo sa na náhradu vyberie náhodný riadok. ☺ Čítanie položiek nachádzajúcich sa v operačnej pamäti aj vo VP sa vykonáva zásadne len z VP, ak položky nie sú označené ako neplatné. Zápis sa u klasického počítača PC (386, 486) vykonáva vždy aj do hlavnej pamäte. Takýto zápis používa na prenos zbernicu, čo trvá pomerne dlho. Je to režim práce Write Through. Moderné systémy môžu použiť omnoho rýchlejšiu metódu označovanú ako Write Back, kedy sa do operačnej pamäte zapisujú dáta až keď je to nevyhnutné, napríklad keď má byť riadok v cache nahradený novým riadkom. Hlavne v cykloch to prináša úsporu času. Niekedy musia byť dáta zapísané až do pamäte – napríklad ak ich ukladáme na pevný disk pomocou obvodu DMA, pretože ten nemá prístup do vyrovnávacej pamäte procesora. Tiež keď potrebujeme daný riadok VP pre dáta z inej adresy v operačnej pamäti alebo sú dáta určené pre zobrazenie na monitore apod. Už sme si uviedli, že dátová položka v riadku vyrovnávacej pamäte zaberá nie jeden, ale 32 bajtov. Nachádza sa tam teda celý blok dát. Medzi operačnou pamäťou a VP sa aj pri požiadavke na prenos jediného bajtu v skutočnosti prenášajú väčšie bloky „do zásoby.“ To urýchľuje prácu procesora, ak budú položky naozaj využité...
Urýchlenia mikroprocesora Pentium Ak sa narazí na inštrukciu podmieneného skoku, mikroprocesor Pentium si do fronty pripravených inštrukcií nachystá nasledujúcu inštrukciu pre obidve možnosti (splnenú aj nesplnenú podmienku), aby sa pri ich vyberaní z OP nezdržiaval. Navyše obsahuje tabuľku BTB (Branch Target Buffer) – vyrovnávaciu pamäť adries posledných skokov a pre každú adresu si v tabuľke BTB drží dva bity, ktorými predvída, či nastane skok, takto: Vždy, keď skok nastal, hodnota sa inkrementuje (na dvoch bitoch je to číslo od 0 do 3), ak nenastal, hodnota sa dekrementuje. Ak je hodnota rovná 0, procesor predpokladá, že skok nenastane a do fronty predspracovaných inštrukcií si nachystá inštrukcie nasledujúce za inštrukciou skoku. BTB má kapacitu 256 položiek a pamätá si iba cieľovú adresu. Nová položka sa zapisuje na náhodné miesto. Prepisom položky nachádzajúcej sa na náhodnom mieste nestrácame žiadne dôležité dáta. Pentium II a vyššie majú niekoľko ALU, ktoré vykonávajú popri bežných aj nadbytočné inštrukcie do zásoby do „tajných registrov.“ Pri požiadavke na takúto inštrukciu v blízkej budúcnosti sú schopné namiesto celého strojového cyklu ju jednoducho okopírovať „z tajného registra.“ Takáto architektúra procesora má prvky tzv. Post-RISCovej architektúry, čo už je mimo nášho základného kurzu.
BIOS BIOS – Basic Input & Output System býva uložený v pamäti typu ROM. Read Only Memory je pamäť, z ktorej možno iba čítať, ale zapisovať sa do nej bežným spôsobom nedá. Preto napríklad nosič CD, z ktorého sa dá iba čítať, označujeme ako CD-ROM. Pamäť ROM je u PC mapovaná do určitej oblasti operačnej pamäte. Operačná pamäť je samozrejme typu RAM – Random Access Memory, pamäť s náhodným prístupom. Dôvodom tohto označenia je skutočnosť, že je možné k jednotlivým bajtom tejto pamäte pristupovať v ľubovoľnom poradí. Lepšie je ale označenie RWM – Read Write Memory, pamäť na čítanie i zápis. Toto označenie vyjadruje, že sa do operačnej pamäte dá aj zapisovať. Čipová sada počítača PC sa stará o namapovanie BIOSu. To znamená, že keď bežnými prostriedkami chceme čítať dáta z oblasti najvyššieho segmentu RWM, čipová sada namiesto toho presmeruje signál na ROM. strana
21
Procesor, inštrukčné a zbernicové cykly, I/O, prerušenia, DMA, VP, BIOS apod.
Prečo je BIOS (označovaný aj ako ROM-BIOS) taký dôležitý? Ukrývajú sa v ňom inicializačné inštrukcie spustenia počítača. To znamená, že po zapnutí počítača sa registre ukazujúce na inštrukcie, t.j. registre CS:IP, nastavia na hodnoty ukazujúce na inštrukcie v adresnom priestore, do ktorého je mapovaný BIOS. BIOS patrí medzi tzv. firmware, čo je základné programové vybavenie (softvér) dodávané výrobcom. Jeho úlohou je spustiť počítač, zaviesť operačný systém z externého zariadenia (väčšinou z pevného disku) a poskytovať základné funkcie (cez prerušovacie vektory) na komunikáciu so zariadeniami. Preto po spustení počítača BIOS vytvorí počiatočnú tabuľku vektorov prerušení a nastaví jej základné funkcie. Operačný systém si, len čo je zavedený BIOSom, podľa potreby upraví tabuľku vektorov prerušení a môže si zaviesť obslužné programy umožňujúce komunikáciu so zariadeniami, pre ktorú BIOS obsluhu neponúka (kamera, tlačiareň). Obslužné programy sa nazývajú ovládače zariadení. Operačný systém pritom môže využívať aj niektoré funkcie BIOSu (tak to robí operačný systém Windows) ale môže aj kompletne zmeniť vektory prerušení a poskytovať iba svoje funkcie. Takto to robí Linux. Výhodou vynechania BIOSu z hry je fakt, že používateľ nepotrebuje tak často inovovať BIOS na nové verzie, lebo s každou novou verziou jadra operačného systému získa aj najnovšie ovládače externých zariadení.
Spustenie počítača Po stlačení tlačidla RESET alebo po spustení počítača rozpozná mikroprocesor aktívnu úroveň signálu RESET privedeného priamo na jednu z nožičiek mikroprocesora. Po rozpoznaní požiadavky o RESET mikroprocesor vykoná nasledujúce akcie: Zneplatnia sa vyrovnávacie pamäte (dátová i inštrukčná interná vyrovnávacia pamäť ako aj externá vyrovnávacia pamäť) nastavením bitu Invalid vo všetkých riadkoch na hodnotu 1. Môže nastať test procesora BIST (Built-In Self Test) a register CS:IP sa nastaví na hodnotu o 16 slabík nižšiu, než je horný koniec pamäte adresovateľnej v reálnom režime (teda 1MB – 16B). Sem musí byť namapovaný BIOS. Prvá inštrukcia sa teda spúšťa z BIOSu. BIOS ako programové vybavenie dodané výrobcom počítača je potom mikroprocesorom vykonávaný ďalej, uskutoční rozpoznanie množstva inštalovanej operačnej pamäte, otestuje ju jednoduchým testom a rozpozná základné hardvérové vybavenie počítača. (To sa mohlo od posledného vypnutia zmeniť.) Nakoniec spúšťa operačný systém, ktorý vykoná omnoho dôkladnejšie testy a nastavenia hardvéru. Súčasťou BIOSu je pamäť typu CMOS. Má takú nízku spotrebu, že je zálohovaná obyčajnou „gombíkovou“ 3V lítiovou batériou. V pamäti typu CMOS je uložená konfigurácia počítača, ktorú podľa potreby mení sám používateľ. Do nastavovacieho režimu sa dostane, ak po spustení počítača stlačí kláves DEL (najbežnejší prípad). Nastavovať sa dajú napríklad typy pevných diskov a niektoré urýchľovacie funkcie BIOSu. Jedno z nastavení umožňuje prekopírovať BIOS z ROM do RWM pamäte. Funkcie vykonávané programovým kódom BIOSu potom pobežia rýchlejšie, pretože odozva pamäte RWM je kratšia.
strana
22