Sunday, June 12, 2011

HW: Prerusenia

Prerusenie je zvycajne definovane ako udalost, ktora ovplyvnuje sekvenciu instrukcii vykonvanych CPU. Su vyvolane elektrickymi signalmi generovanymi obovodmi vnutri alebo mimo cipu. 

Prerusenia delime na

  • synchronne
    Tieto su vyvolane specialnou instrukciou, akou je INT, TRAP, SVC atd., alebo inou instrukciou, ktora oznacuje neziaduci stav. Neziaducim stavom moze byt delenie nulou, preplnenie (asi sa ma na mysli pretecenie), nedovoleny operacny znak ... apod.

    Synchronne su preto, ze su synchronizovane hodinami, alebo cinnostou procesoru. Su teda vyvolane po ukonceni instrukcie.

    INT - jedna sa o SW prerusenie, teda instrukciu prerusenia INT x, kde x je kod chyby
    TRAP - napriklad pretecenie pri aritmetickych vypoctoch
  • asynchronne
    Sposobene perifernymi zariadeniami. Moze sa jednat napriklad o poziadavok operatora, ineho procesoru, modemu ...
    Mozu ale pochadzat aj zvnutra a mozu byt vyvolane casovacom, kontrolnymi obvodmi, vypadkom zdroja napajania. Tieto udalosti nie su synchronizovane (tazko synchronizovat chybu zdroja s vykonavanim instrukcie). 
Prerusenia maju urcitu prioritu a este maju taku tajomnu vec, zvanu maska. Maska prerusenia je dana obsahom registru a umoznuje nielen prerusenie potlacit, ale aj viacurovnove riesenie preruseni. Nie vsetky prerusenia su maskovatelne. Aby sme boli dostatocne presny, tak maska prerusenia je vlastne register, kde kazdemu bitu je priradena jedna alebo viac pricin prerusenia. Priciny prerusenia, ktore su priradene nulovym bitom masky su zamaskovane. Tie prerusenia, ktore nevieme zamaskovat, nie su priradene ziadnym bitom masky a preto su stale odmaskovane. Maska sa nastavuje pomocou instrukcie a tato instrukcia sa da pouzit ako prva instrukcia rutiny prerusenia. Mne osobne to pripomina ako block try .. catch.


Maska přerušení - je registr, kde každému jeho bitu je přiřazena jedna nebo více příčin přerušení. Příčiny přerušení, které jsou přiřazeny nulovým bitům masky jsou zamaskovány. Některé příčiny přerušení nemusí být přiřazeny žádnemu bitu masky  jsou stále odmaskovány. Masku přerušení lze nastavovat pomocí přislušné instrukce. Tato instrukce se může použít jako první instrukce rutiny přerušení a zamaskovat tak všechna přerušení.


Obsluha prerusenia na HW urovni 
Uplne v skratke, ak nastane preusenie, tak sa CPU vykasle na doterajsiu cinnost a sekvenciu instrukcii, skoci na dany podprogram prerusenia, dokonci ho, obnovi kontext a pokracuje. Napriklad, v pripad scitania dvoch velmi velkych integerov, moze dojst k preteceniu (overflow). Overflow bit sa nastavi a vykona sa podprogram prisluchajuci danemu preruseniu (TRAP). 

Teraz trosku podrobnejsie

Vektor prerusenia je adresa podprogramu obsluhy prerusenia, ktora je zapisana do PC. V pamati je obycajne na najnizsich hodnotach vyhradeny priestor, kde su umiestnene vektory prerusenia, alebo lepsie povedane, adresy podprogramu pre zpracovanie daneho typu prerusenia. 

Radic prerusenia je HW zariadenie, ktore nam asistuje pri preruseni. Cita signaly z V/V (I/O) zariadeni, identifikuje ich a generuje signal prerusenia. 


  1. ulozime data prerusenia 
    data ulozime na zasobnik FR, PC, alebo na urcene adresy (podla typu prerusenia)
    • to znamena, ze musime ulozit stary kontext, aby sme mohli pokracovat v prerusenom programe 
    • ulozenie blizsej specifikacie priciny prerusenia 
  2. Zakazeme dalsie prerusenia 
  3. nastavime novy kontext 
    toto sa robi z tzv. vektoru prerusenia, zase podla typu prerusenia. Znamena to, ze nastavime PC na adresu, kde zacina podrpogram prerusenia. 
  4. Vykona sa obsluha prerusenia 
    Inymi slovami, vykona sa program prerusenia
  5. Obnovenie kontextu 
    Vratime sa tam, odkial sme prisli a pokracujeme v podrpograme 

Pokial poziadavka na prerusenie pride z vonku, tak je 

  1. prebrata radicom I/O zariadeni, ktory generuje signal IRQ
  2. dalej radic prerusenia vygeneruje signal prerusenia (INT), cim ziada procesor o prerusenie. 
  3. procesor sa rozhodne, ze ci vyhovie a posle signal INTA (Interrupt ACK)
  4. a pokracuje sa tak, ako keby to bolo zvnutra, ulozenie stareho kontextu, nastavenie noveho kontextu, obsluha prerusenia, obnovenie kontextu



Uz na zaciatku som vravel, ze prerusenie moze mat urcenu prioritu. Priorita riesi problem s preruseniami, ktore boli vyvolane sucasne. Ak vznikne viac prerusenie naraz, tak sa obsluzi ta, ktora ma najvyssiu prioritu prerusenia. Rovanku prioritu nemozme priradit preruseniam, ktore mozu vzniknut sucasne.

Ked je vyvolana rutina prerusenia, tak zvycajne nie je mozne vyvolat ine prerusenie. Takyto postup nazyvame jednourovnove prerusenie. V pripade, ze je mozne vyvolat prerusnenie pocas behu rutiny prerusenia, tak hovorime o viacurovnovom preruseni. Viacurovnove prerusenie ale prinasa problemy, je potreba zabranit tomu, aby prerusenie s nizsou prioritou mohlo prerusit rutiny s vyssou prioritou. Zvycajne je dalsie prerusenie mozne az po niekolkych taktoch rutiny prerusenia, ked su vsetky dolezite informacie ulozene na zasobniku.

Prerusenie nemusi byt len sprava o chybe. I/O operacie je mozne taktiez riadit pomocou preruseni

  1. CPU povie radicu co ma robit tak, ze zapise prikaz do riadiaceho registra 
  2. ked radic I/O zariadenia dokonci operaciu, tak posle signal do radica prerusenia
  3. ked je radic prerusenia pripraveny spracovat prerusenie, tak o tom informuje CPU a vystavi cislo I/O zariadenia na zbernicu 

To by sme mali, ale kde je operacny system? Ten tiez musi vediet o tom, ze nejake prerusenie sa udialo a pripadne reagovat. OS musi nielen vediet vyslat prikaz v pripade prerusenia, ale musi vediet aj reagovat na prerusenie. Okrem toho, este musi vediet zakazat neautorizovany pristup. To, co vlastne OS robi je rozhranie medzi zariadeniami. Zabezpecuje jednotny pristup na urovni API, pristup k zariadeniam na vyssej urovni abstrakcie, virtualizuje zariadenia - tzv. spooling, pomenuvava zariadenia a reaguje na chyby. Pristup k zariadeniu je zabezpeceny cez radic I/O zariadeni

I/O zariadenia musia mat nejaky SW, ktory organizuje ich cinnost. Takyto SW sa vacsinou sklada zo 4 vrstiev, hoci je zavisle na systeme. Zvycajne je sucastou OS

  • user level I/O SW - I/O volania, spooling
  • Device independent SW - naming, protection, blocking, buffering, allocation 
  • Device drivers - nastavenie registrov, kontrola statusu 
  • interrupt handlers - kontrola preruseni (napriklad wake-up function, ked je prerusenie hotove)
  • hardware