A megszakítási rendszer Bevezetés A megszakítás fogalma A számítógépnek rugalmasan reagálnia kell a külvilág eseményeire. Erre a célra szolgál a számítógép megszakítási rendszere. A megszakítás bekövetkezésekor az éppen futó programról vezérlés ideiglenesen átadódik egy másik program számára, amely kiszolgálja a bekövetkezett eseményt. A megszakítást kiszolgáló program lefutása után pedig a megszakított program végrehajtása a következő utasításától kezdve folytatódik. Egy korszerű nagyteljesítményű számítógép-rendszerektől pedig már nem csupán egy egyszerű reagálást kívánunk meg, hanem ezen túlmenően: hogy folyamatosan változó körülmények között is optimálisan dolgozzanak. Az optimális működés jellegét a rendszer sajátosságai döntik el. -
egy személyi számítógép esetén például érzékelnie kell, ha valamit a billentyűzetén begépelünk; az azonos idejű (real-time) és folyamatirányítási (process control) rendszerek esetén a gyors válaszadási idő az elsőrendű feladat esetleg az eredő hatásfok rovására is. Például határértéktúllépés esetén mindennél fontosabb a vészjelzés adása illetve az automatikus, azonnali beavatkozás. A megszakítás születése
A megszakítási rendszereket elsődlegesen az I/O műveleteknek és a velük átlapoltan végrehajtott számítási művelteknek a összehangolására hozták létre. A megszakítás célja az volt, hogy egy I/O tevékenység beindítása után a processzornak ne kelljen várakoznia az I/O művelet befejeződésére, hanem ezalatt más feladat vagy feladatrész végrehajtásába foghasson. Viszont az I/O tevékenység befejeződéséről valahogy értesítenünk kell a processzort. Ezért az I/O tevékenység befejeződése egy megszakítás-kérő jelet generál, amely az éppen végrehajtás alatt álló utasítás befejeződése után, a végrehajtásra következő utasítás megkezdése helyett megszakítást (vezérlés-átadást) hoz létre egy, a megszakítás konkrét okától (forrásától) függő címre, a szükséges megszakító rutinra. Egyúttal automatikusan (hardverrel) tárolódnak a megszakított programnak a megszakítás pillanatában fennálló legfontosabb állapotjellemzői és regiszterei (együtt: kontextus), hogy azok később, a megszakított program folytatásakor visszaállíthatók legyenek; valamint beállítódnak a megszakító rutin induló állapotjellemzői és regisztertartalmai. A megszakító rutin végén megtörténik a vezérlés visszaadása a megszakított programra: például az utasításszámláló új tartalma a megszakított program végrehajtásra következő utasításának címe lesz. Terminológia Maga a megszakítás (interrupt) szó IBM eredetű, ezt használja az Intel is. A Motorola 68000 terminológia szerint ezt kivételnek (exceptions) hívják. A VAX terminológia viszont megkülönbözteti egymástól a megszakítást és a kivételt.
A megszakítások okai vagy forrásai A megszakítási rendszert az eredeti célon, az I/O tevékenységek és feldolgozási tevékenységek szinkronizálásán kívül ma már egyéb célokra is felhasználják. A megszakítási okok vagy megszakítási források a következőképpen osztályozhatók: Géphibák Ebbe az osztályba az automatikus hibafigyelő áramkörök jelzései tartoznak: A hibafigyelő áramkörök egy része általában hibajelző kódok alkalmazásával (pl. paritáskontrollal) tárja fel az adatátviteli vonalak, CPU-regiszterek vagy az operatív memória hibáit. 1/15
-
A hibafigyelő áramkörök másik része az energia-ellátás és a klimatizáció-hűtés zavarai esetén jelez. I/O források
Ide tartoznak a perifériák megszakítás-kérő jelzései, amelyek általában az I/O tevékenységek befejeződésekor vagy üzenetközlést kezdeményező perifériák bevezető állapotjelzései hatására alakulnak ki. Külső források Ebbe az osztályba tartoznak a külső eszközök által generált megszakító jelek (pl. a régi gépeknél a kezelőpult megszakító-kulcsának lenyomása vagy a mikrogépeknél a reset-gomb benyomása, összekapcsolt gépek esetén a másik gép jelzése). Programozási források Azok a megszakítás-kérések, amelyek ebbe az osztályba tartoznak, mindig valamilyen utasítás végrehajtása vagy végrehajtásának megkísérlése következményeként alakulnak ki. E megszakítások célja általában a programozási hibák jelzése vagy kiküszöbölése, de a programozó bizonyos célokból szándékosan is előidézhet ilyen típusú megszakításokat. A programozási okok részletesebb felbontása a következő: A memóriavédelem megsértése Ha az operatív memóriában egy időben több, egymástól független feladat programja tárolódik, szükség van azok védelmének megszervezésére, elsősorban véletlen felülírás ellen. Különféle védelmi eljárások alakultak ki, amelyek a memóriák tárgyalásánál kerülnek ismertetésre. Ha egy program futása során "idegen" címre hivatkozik, az alkalmazott hardver memóriavédelem működésbe lép A tényleges tárkapacitás túlcímzése Ha a tényleges, fizikailag meglévő tárkapacitás kisebb, mint az utasítás végrehajtása során elméletileg kiadható legnagyobb cím, előfordulhat a tényleges tárkapacitás véletlen túlcímzése. Ebben az esetben szintén megszakítás következik be. A címzési előírások megsértése A bájt-szervezésű gépeknél az utasítások hossza általában 2, 4 vagy 6 bájt lehet. Ez szokásosan együtt jár azzal a címzési előírással, hogy utasítás csak páros című bájttal kezdődhet. Ha például egy ugró utasítás páratlan címre ugratne, ez programhibát jelent és ezért végrehajtás helyett megszakítás történik. Hasonló címzési előírás lehet például hogy dupla szó csak 8-cal osztható című bájttal kezdődhet. Aritmetikai-logikai műveletek miatti megszakítások Ide tartoznak az integer és a lebegőpontos számok túlcsordulásai.
A megszakítások csoportosítása Szinkron - aszinkron megszakítások Azon megszakítások, amelyek a programnak ugyanazon adatokkal való végrehajtása során mindig ugyanott lépnek fel, szinkron megszakításoknak nevezzük. Ilyen például az integer túlcsordulás. Az aszinkron események viszont véletlenszerűen következnek be. Például az I/O egység kérte megszakítások, a hardver-hibák. Az utasítások végrehajtása között illetve közben fellépő megszakítások
2/15
Az utasítások végrehajtása között fellépő megszakítások az éppen végrehajtott utasítás eredményeképpen következnek be (például túlcsordulás, page fault, tárvédelmi hiba). A kezelése rögtön az utasítás végrehajtása után elindulhat, s a programfutás eredményessége aztán a kezelés eredményétől függ; Az utasítások végrehajtása közben fellépő megszakítások valamely utasítás végrehajtása alatt (tehát nem az utasítás-végrehajtási ciklussal szinkronban) merülnek fel. Ilyenek például a hardvermegszakítások. Ekkor az esetek többségében először befejezésre kerül az éppen végrehajtás alatt álló utasítás, s csak utána kezdődik meg a megszakítás kiszolgálása. A felhasználó által explicit kért és nem kért megszakítások A felhasználó által explicit kért megszakítás például az operációs rendszer szolgáltatásának meghívása, a nyomkövetés vagy az utasítás töréspont. Véletlenszerűen fellépő A felhasználó által nem kért megszakítás például az integer túlcsordulás, az I/O egység megszakítás, a hardver hiba. A megszakított program folytatódik vagy befejeződik A megszakított program folytatódik például I/O egység igénye alapján történő megszakítás, operációs rendszer szolgáltatásának meghívása esetén. A megszakított program futása befejeződik hardver hiba esetén. Felhasználó által maszkolható vagy nem maszkolható megszakítások A felhasználó által maszkolható például a nyomkövetés, a töréspont. Nem maszkolható viszont az I/O egység megszakítási kérése, az operációs rendszer szolgáltatásának meghívása.
Egy megszakítás kiszolgálásának általános folyamata A program-megszakítás lehetősége egy számítógépnek olyan tulajdonsága, amelynek segítségével egy program bármely utasítás után leállítható, majd tetszőleges számú utasítás végrehajtása után, a program a soron következő utasításától újra indítható. A megszakítási rendszert miért tárgyaljuk a fizikai architektúra keretében? A kezelésük vegyesen, hardver és szoftver úton történik, s a szoftver keretében nincs igazán mód a hardver-vonatkozások ismertetésére.. A megszakítás előkészítése 1. valamilyen egység megszakítási kérést bocsát ki, azaz aktiválja az INTR vezérlővonalat; 2. a megszakítás beérkezésekor a számítógép az éppen folyó utasítást még végrehajtja: 3. minden utasítás-töréspontban a vezérlőegység megvizsgálja, hogy van-e megszakítás. Észleli, hogy van megszakítás. Az INTACK vezérlővonal aktiválásával jelzi a megszakítási kérés elfogadását, mire a megszakítást kérő deaktiválja az INTR vonalat; A megszakítás kiszolgálásának a hardver által végzett feladatai 1. Ekkor a processzor elkezdi annak az előkészítését, hogy az eddig futó program helyett a megszakítást kiszolgálását végző programot kezdhesse végrehajtani. Ennek során a programtól általában függetlenül (tehát hardver úton) egy erre a célra kijelölt memória-tartományba, a veremtárolóba kimenti azokat az állapot-információkat (a PC és az állapotregiszterek tartalma), amelyek a megszakított programnak a megszakítás bekövetkezése utáni folytatásához szükségesek. 2. Ezután a számítógép rátérhet mindazoknak a műveleteknek a végrehajtására, amelyek érdekében a megszakítás bekövetkezett. Ennek érdekében be kell töltenie a megszakítást feldolgozó program első utasításának címét a PC-be, továbbá esetleg, tehát nem minden architektúra esetén be kell töltenie a megszakítást kiszolgáló program futásához szükséges állapot-információkat. Ezen két adatcsoport megszerzési módja architektúra-függő. Ez benne lehet az eredeti megszakítási kérésben vagy esetleg a processzornak kell kezdeményezni - akár a megszakítást feldolgozó programban - a megszakítást kérőnél ezen adatok rendelkezésre bocsátását. Szintén architektúra-függően a 3/15
megszakítást kérő program lehet egyetlen program az összes megszakítás feldolgozására, lehet egyegy önálló program minden egyes megszakítás-típushoz, stb. Mihelyt a PC-be betöltésre kerül a megszakítást kiszolgáló program első utasításának címe, a processzor készen áll a megszakítást kérő rutin futtatására.. A megszakítás kiszolgálásának a szoftver által végzett feladatai 1. Azonban míg az állapottér információinak mentését a hardverre bíztuk, még hátravan a megszakított program adatterének (pontosabban az aktuális regiszter-tartalmának) mentése, hiszen a regisztereket a megszakítást kiszolgáló program is használhatja s ezáltal tönkretenné a megszakított programok által beállított értékeket. Általában a megszakítást feldolgozó program első utasításai pont ezen regiszter-tartalmak mentését végzik, szintén a veremtárolóba. 2. Amennyiben egyetlen megszakítás-kiszolgáló program van, vagy egy megszakítás-típushoz több egység is tartozik, először beazonosítja a megszakítás-kérő egységet. 3. A megszakítás tényleges kiszolgálása. Ennek során például I/O megszakítás esetén beolvassa a megszakítást kérő I/O port adatregiszterének tartalmát, esetleg további parancsokat küldhet az I/O egység számára, s azok végrehajtását is ellenőrizheti az I/O egység státuszregiszterének újabb beolvasásával (mint a hardver 2. pontban említett esetben az állapot-információk átküldését kérheti explicit). 4. A megszakítás kiszolgálásának befejeződése után (amennyiben a megszakítás nem okozott rendszer-leállítást) gondoskodni kell arról, hogy egy programmal visszaírjuk a megfelelő regiszterekbe a megszakítási veremtárolóból a megszakított program folytatásához szükséges adatokat, majd ezután megkezdődhet a megszakított program következő utasításának végrehajtása. A megszakítás tehát abban különbözik a közönséges programtól, hogy a program futásának megszakítása során a megszakított programtól teljesen függetlenül lejátszódik egy olyan folyamat, amelynek eredményeképpen az összes jellemző regiszter pillanatnyi állapota tárolódik egy veremmemóriában.
A megszakítás kiszolgálása A megszakítás észlelése és nyilvántartása . A megszakítás észlelése A megszakítást a hardvertől függően a megszakítási vezérlővonal feszültségszintje (szintérzékeny bemenetű hardver) vagy a jel valamely éle (élérzékeny bemenetű hardver) váltja ki. A megszakítások nyilvántartása Minden egyes forráshoz tartozik egy jelző flipflop, amelyeket a forrásokban keletkezett megszakításkérések állítanak 1-be. Ezek összességét nevezzük megszakítási jelző (flag) regiszternek, amely tehát az egyes forrásokból érkezett, még teljesítetlen megszakítás-kéréseket mutatja. Gyakran előfordul, hogy a jelző-regisztert alkotó flipflopok nem a CPU-ban, hanem magukban a forrásokban találhatók. A megszakításkérő egység felismerése Mivel egy rendszerben több megszakítást kérő eszköz is lehet, ezért először azonosítani kell magát a megszakítást kérő eszközt. Egy megszakításkérő vonal esetén Lekérdezéses (polling) Mihelyt valamelyik egység megszakítást kér, csupán azt lehet tudni, hogy valaki megszakítást kért. Ekkor három megoldást alkalmazatak:
4/15
el kell kezdeni valamilyen sorrendben lekérdezni az egyes egységeket, hogy kértek-e megszakítást, s az első olyan egység kérését, amely megszakítást kért, kiszolgáljuk. Az egységek lekérdezése történhet hardver úton (hardware polling vagy daisy chain) vagy szoftver úton (software polling); Vektoros (vectored) Ez lehetővé teszi, hogy a megszakítást kérő egység azonosítsa magát, ami kiküszöböli az időtrabló lekérdezést. A nevét onnan kapta, hogy a megszakítás-kérésen kívül egy megszakítási vektornak nevezett bitsorozatot is átküld. A megszakítási vektor tartalma architektúránként változó. A küldési lehetőségek a következők: a megszakítást kérő egység a megszakítási vonal aktiválásán kívül a sínen elküldi egy azonosítóját, ami általában a kiszolgálását jelentő szervíz-program kezdőcíme; a megszakítást kérő egység a megszakítási vonal aktiválásán kívül a sínen elküld egy megszakítási csoport-azonosítót, ezután valamilyen sorrendben el kell kezdeni az adott csoportba tartozó egyes egységek lekérdezését. Több megszakításkérő vonal esetén Mivel több megszakításkérő vonal segítségével a megszakítást kérő egység azonosíthatja magát, tehát ez a vektoros megszakítás-kérések közé tartozik. A megszakítások engedélyezése és tiltása (maszkolás) Programozható engedélyezés és tiltás A CPU utasítás-készletében általában van olyan utasítás, amely lehetővé teszi a megszakítás-kérések tiltását vagy maszkolását. Az ilyen utasításokkal a programozó valóban kikapcsolhatja az egyes megszakítás-kérési vonalakat, melyek eredményeképpen a CPU bizonyos megszakításokat nem vesz figyelembe. Például a lebegőpontos alulcsordulást maszkolhatjuk. Sok periféria státuszregiszterében van egy interrupt enable flag, melynek állása határozza meg, hogy a megszakítását a CPU elfogadja-e vagy sem. Másképp: Minden egyes forráshoz tartozik egy-egy maszk-bit, amelyek a megfelelő forrásokból érkezett (indikált) megszakítás-kérések elfogadását engedélyezik vagy megtiltják (kimaszkolják). A "megtiltás" a forrás jellegétől függően vagy a kérés (jelző-flipflop) törlését vagy csak várakoztatását jelenti.A maszk-bitek összessége a maszk-szó, amelyet a maszk-regiszter tartalmaz. Mivel a maszk-regiszter a program állapotának (megszakíthatóságának) fontos jellemzője, ezért a maszk-regiszter az IBM 360 esetén például a programállapot-regiszter része, így új PSW aktivizálásakor a maszk-regiszter is megváltozhat. A megszakítás-kérések figyelésének és engedélyezésének általános elve:
5/15
M e g s z a k ítá s -k é r é s e k a fo r r á s o k b ó l
J e l z ő (fl a g ) r e g i s z te r
P a r a n c s a m e g s z a k ítá s i fe l té te l e k e l e m z é s é r e
Pa ra n cs a m e g s z a k ítá s r a K i v á l a s z tó l o g i k a
A j e l e n l e g i m e g s z a k ítá s i s z int kódja
Az e l fo g a d o tt k é r s é s z i n tk ó d j a é s a fo r r s á s úly kódja
Az a k tív m a s z k -r e g i s z te r
M a s z k -s z ó b e tö l té s e Az általános ismertetésben szereplő azon megállapítás, mely szerint minden forráshoz tartozik egy-egy maszk-bit, pontosításra szorul: -
-
-
bizonyos forrásokhoz egyáltalán nem tartozik maszk-flipflop (Pl. definiálatlan műveletkód használata, privilegizált utasítás használata normál állapotban). Az ilyen források szerinti megszakítás-kéréseket mindig ellenőrzöttnek tekintjük; más forrásokhoz pedig néha két maszk-flipflopot is hozzárendelnek (pl. aritmetikai műveletek szignifikancia-hibáihoz). Az ilyen ok szerinti megszakítás engedélyezéshez mindkét maszkflipflopnak engedélyező állásban kell lennie. Végül az is gyakran előfordul, hogy több forrásnak egyetlen, közös maszkja van. Nem programozható engedélyezés és tiltás
A mai mikroprocesszorok többsége rendelkezik egy non-maskable interrupt request (NMI) vonallal. A nem maszkolható kifejezés azt jelenti, hogy ezt nem lehet kikapcsolni. Egy NMI azonnal kiszolgálandó. NMI-hez általában a rendszerszinten kritikus hibákat szokták kapcsolni, például a RAM paritáshibát vagy a tápellátás hibája. Mikor ez bekövetkezik, a számítógép még néhány másodpercig működőképes, mivel minden tápegységben van egy pici energiatároló kapacitás. Az NMI azonnali kiszolgálása révén a számítógép normál módon lekapcsolódik, tehát a számítógép újraindítása könnyen lehetséges. A prioritások kezelése Miután megállapítottuk a megszakításunk forrását, kézenfekvő eset lehet az, hogy egyszerre több forrás kér kiszolgálást. Ekkor a rendszernek azt is el kell tudni dönteni, hogy melyik megszakítás-kérést szolgálja ki először. Prioritások nélküli rendszer Ez azt jelenti, hogy a megszakításokat beérkezésük sorrendjében szolgáljuk ki. Nagy hátránya, hogy az időérzékeny megszakítások (lásd később) kiszolgálása így megkéshet és ezért például adatvesztés következhet be. Prioritásos megszakítási rendszer
6/15
A prioritásos megszakítási rendszer esetén egy prioritási sorrendet rendelünk az egyes forrásokhoz, s így meghatározzuk, hogy két vagy több megszakítási igény esetén melyiket szolgálja ki a rendszer elsőként. Prioritási csoportok Az egyes prioritási csoportok értelmezése a következő: A védelmi rendszer megsértése és hardver-hibák Ezeknek van a legmagasabb prioritásuk. Csak akkor van értelme tovább folytatni az összes többi munkát, ha ezek lekezelése azt lehetővé teszi. Kritikus időzítés Amikor az adatátviteli vonalakon jön egy üzenet és egy karakter-alapú kommunikációs illesztő kéri a megszakítást, akkor rövid idő alatt ki kell szolgálni a megszakítást, mert különben az adat elvész. Teljesítmény Két eset lehetséges: egy bizonyos felhasználónak valamilyen okból magasabb a prioritása, amiből az következik, hogy az általa üzemeltetett foylamatoknak magasabb prioritást kell biztosítani; valamely programnak rendkívül magasak az erőforrás-igényei (például az operatív memória-igénye, s ezért a multiprogramozás kevésbé hatékony. Ekkor a nagy erőforrásigényű folyamatnak adnak jóval nagyobb prioritást, hogy rövidebb ideig okozzon hatékonysági problémát. A prioritás eldöntésének algoritmusa A prioritás eldöntésének algoritmusa általában programozható. Általában a következő két algoritmust használják: Fix prioritás A megszakítási források prioritása az időben állandó, a megszakítást kérő egységekhez véglegesen hozzá van rendelve. Hátránya, hogy amennyiben egy magas prioriátsú forrás gyakran kér megszakítást, akkor az elnyomja az alacsonyabb prioritásúakat. Ezt alkalmazzák az IBM PC esetén (Intel 8259A megszakítás-vezérlő), ahol a prioritási szintek száma 8 illetve 15. Körbenforgó prioritás (rotating) Bizonyos megvalósításoknál több eszköz rendelkezik azonos prioritási szinttel. Ekkor a csoporton belül a legutoljára kiszolgált megszakítási forrás kerül a prioritási sor végére. Ennek hátránya, hogy sürgős kérés esetén esetleg túl későn lesz kiszolgálva. Ilyen megoldást alkalmaznak az IBM PC (Intel 8259A megszakítás-vezérlő) esetén. Speciális maszk Ez lehetővé teszi a processzor számára, hogy bizonyos egységektől érkező megszakítási jelzéseket letiltson. Ilyen megoldást alkalmaznak az IBM PC (Intel 8259A megszakítás-vezérlő) esetén. A prioritásos megszakítás-kezelés megvalósítási módja Hardver lekérdezéses (hardware polling vagy daisy chain) megszakítási rendszer A daisy chain esetén a processzortól megszakítást igénylő valamennyi egységet sorban felfűzünk úgy, hogy a legmagasabb prioritású lesz az első helyen, a következő egység pedig eggyel alacsonyabb prioritással fog rendelkezni. Amennyiben bármelyik egység megszakítási igénnyel rendelkezik, akkor aktiválja az INTR vezérlővonalat. Erre válaszképpen a processzor aktiválja az INTACK vezérlővonalat. Azon egység, melynek nincsen megszakítási igénye, átengedi magán az aktivált INTACK vonalat. Viszont amelyik egységnek függő megszakítási igénye van, az 7/15
deaktiválja az INTACK vonalat s így blokkolja az INTACK jelzést és felrakja az adatsínre a megszakítási vektorát. A módszer hátránya, hogy az INTACK jel sorosan, azaz lassan terjed az egységek között.
D ATA B U S IN TACK U1
U2
Un
CP U CON TR OL B U S IN TR Prioritási csoportok szervezése
INTRACK INTRACK1 U Prioritásos arbitrálási áramkör
CPU
U INTR1 INTRACK2
U
U INTRn
INTR Prioritási csoportok szervezését az architektúrák többsége biztosítja, például a PDP11, a Motorola 68000 család és az Intel 8259A megszakítás vezérlő. Szoftver lekérdezéses (software polling) megszakítási rendszer Amikor a szoftver-lekérdezéses módszert alkalmazzuk, akkor a prioritást a lekérdezési sorrenddel határozzuk meg. Párhuzamos kiszolgálású megszakítási rendszer (independent requesting)
8/15
D ATA B U S a m e g s z a k ító p r o g r a m c ím e U IN TR
U
1
U n
2
IN TR 1 p r i o r i tá s o sIN TACK 1 IN TR 2
a r b i tr á l á s i
CP U
IN TACK 2
á ra m kö r
IN TR n IN TACK n
IN TACK
A fenti séma szerint párhuzamosan érkezhetnek a megszakítási kérések az egyes egységektől. Ekkor a CPU egyszerűen csak a legmagasabb prioritásút fogadja. Amennyiben egy megszakitási vonalon több egység osztozik, akkor pedig valamilyen más eljárást kell alkalmazni a csoporton belüli legmagasabb prioritású egység kiválasztására. A megszakítási rendszerek szintek szerint Maguk a megszakítási rendszerek hardver szempontból egy vagy többszintűek lehetnek. Egyszintű megszakítási rendszerek Az egyszintű megszakítási rendszer esetén egyetlen megszakítási szint van, tehát vagy két program-állapot regisztert találunk a CPU-ban (egyet a normál és egyet a megszakítási állapot számára); vagy pedig a régi program-állapot szó tárolására és az új elővételére bármely forrás esetén ugyanaz a főtárrekesz-pár van kijelölve. Így ha egy megszakítás létrejön, újabb megszakításra nincs mód mindaddig, amíg vissza nem térünk a normál állapotba. A jobb megértés kedvéért egy példában tételezzük fel, hogy mindössze három meggszakítási forrásunk van. A legmagasabb prioritású forrást jelöljük 1-essel, a prioritási sorban második forrást 2-essel és a legalacsonyabb prioritásút 3-assal.
9/15
2
M e g s z a k ítá s i s z i n t
1
3
N o r m á l p r o c e s s z o r -á l l a p o t 1 E n g e d é l y e z e tt m e g s z a k ítá s ké ré s e k
2 3
Je lm a g y a rá z a t p r o g r a m m e g s z a k ítá s p r o g r a m fo l y ta tá s
p r o g r a m á l l a p o tv á l tá s (a m e n té s -b e tö l té s i d ő i g é n y é t s z e m l é l te ti a v a s ta g s á g ) a m e g s z a k ító r u ti n b e fe j e z ő d é s e Most tegyük fel, hogy egy normál állapotban futó program valamely utasításának végrehajtása során megszakítás-kérés érkezik a 2-es és a 3-as forrásból, és a maszk-regiszter az összes forrás szerinti megszakítást egyaránt engedélyezi. Egyszintű megszakítás-rendszer esetén a kiválasztó logika mindig a legmagasabb prioritású engedélyezett megszakítás-kérést keresi. Az utasítás végrehajtásának befejeződésekor tehát a kiválasztó logika megállapítja, hogy pillanatnyilag ez a 2-es forrás kérése a jelző-regiszterben és egyidejűleg automatikusan beíródik a 2-es forrás súlykódja a CPU egy meghatározott regiszterébe. A megszakító rutin később ennek alapján keresi meg a megszakítás pontos forrását, majd feldolgozza azt, végül visszaadja a vezérlést a normál állapotra, a megszakított programnak. A 3-as forrásból érkezett megszakítás-kérés elfogadására és feldolgozására legkorábban most kerülhet sor. Ez még nem is volna baj, hiszen a 3-as kérés az éppen feldolgozás alatt állónál alacsonyabb prioritású volt; azonban elképzelhető, hogy - mint az ábrán is látható - közben befut egy magasabb prioritású megszakítás-kérés is. Ez, bár a nálánál alacsonyabb prioritású kéréseket (jelen esetben a 3-as forrásét) maga mödé utasítja, maga is várakozni kénytelen. A 2-es forrás szerinti kérés feldolgozása hosszabb ideig is eltarthat, viszont az 1-es forrás megszakítás-kérése esetleg nem tűrhet ekkora halasztást. Többszintű megszakítási rendszerek Az előzőekben vázolt problémát a többszintű megszakításrendszerek oldják meg. Tegyük fel, hogy minden egyes forráshoz külön megszakítási szint és vagy saját programállapot-regiszter tartozik, vagy külön rekesz-pár az operatív memóriában az Old PSW és a New PSW tárolására. A többszintű megszakításrendszerek szokásos működését előző példánkon mutatjuk be: A kiválasztó logika működésének egy lehetséges algoritmusa többszintű megszakításrendszerben a következó: keresi a pillanatnyi CPU-szintnél magasabb prioritás-szintű engedélyezett megszakításkéréseket. Ha talál ilyeneket, kiválasztja közülük a legalacsonyabb prioritás-szintűt és megszakítást hajt végre erre a szintre, PSW-csere esetén ez oly módon zajlik le, hogy a megszakított szint PSW-je Old PSW-ként tárolódik az új szinthez rendelt főtár-rekesz pár egyik rekeszében, a másik rekesz tartalma pedig New PSW-ként betöltődik a programállapot-regiszterbe. Az elfogadott megszakítás-kérés nyugtázódik (jelző-flipflopja törlődik). Ezzel azonban a kiválasztó logika működése még nem zárult le. Mielőtt az új szinten futó program első utasítása megkezdődhetnék, a kiválasztó logika megismétli a leírt vizsgálatot, és újabb és újabb megszakításokat hoz létre, míg működési algoritmusa ezt előírja. Végül már nem talál a legutoljára beállított szintnél magasabb prioritású engedélyezett kérést és megengedi a legutolsó New PSW-ben megjelölt utasítás végrehajtását. Ezzel az algoritmussal a CPU végeredményben az összes, a jelenleginél magasabb prioritás-szintű engedélyezett megszakítás-kérésre szinte azonnal reagál, és a legmagasabb prioritás-szintű kérés feldolgozását kezdi meg elsőnek. Egy megszakítás-kérés feldolgozása után a megszakító rutin "Load
10/15
PSW" utasítással mindig annak a szintnek adja vissza a vezérlést, ahonnan kapta. Így a megszakításkérések egymás utáni feldolgozása is fontossági sorrendjükben következik be.
1 L e g m a g a s a b b p r i o r i tá s ú m e g s z a k ítá s i s z i n t 2
K ö z b e n s ő p r i o r i tá s ú m e g s z a k ítá s i s z i n t
2
3
L e g a l a c s o n y a b b p r i o r i tá s ú m e g s z a k ítá s i s z i n t
N o r m á l p r o c e s s z o r -á l l a p o t 1 E n g e d é l y e z e tt m e g s z a k ítá s ké ré s e k
2 3
Je lm a g y a rá z a t p r o g r a m m e g s z a k ítá s p r o g r a m fo l y ta tá s
p r o g r a m á l l a p o tv á l tá s (a m e n té s -b e tö l té s i d ő i g é n y é t s z e m l é l te ti a v a s ta g s á g ) a m e g s z a k ító r u ti n b e fe j e z ő d é s e Az elmondottaknak megfelelően a példánkban a következő történik: A 2-es és a 3-as forrás egyidejű beérkezése után először megszakítás történik a 3-as forrás szintjére, majd onnan azonnal tovább a 2-es szintre. Itt megkezdődik a 2-es ok elemzése és feldolgozása. Az időközben az 1-es forrásból érkező kérés miatt a feldolgozás abbamarad, és megszakítás történik az 1-es szintre. Itt megtörténik az 1-es ok feldolgozása, majd visszaadódik a vezérlés a 2-es szintre, ahol folytatódik a 2-es feldolgozása. Ennek befejeztével visszaadódik a vezérlés a 3-as szintre, és a 3-as feldolgozása is megtörténik. Végül a vezérlést ismét a normál szintű program kapja meg. Az elmondottak még annyiban szorulnak kiegészítésre, hogy - mivel egy megszakításkor az új PSWvel egy új maszk-szó is aktiválódik - a további megszakítások engedélyezése szempontjából már nyilván az új maszk-szó az érvényes. Többszintű megszakításrendszerben a kiválasztó logika működésének egy másik lehetséges algoritmusa a következő: a kiválasztó logika keresi a pillanatnyi CPU-szintnél magasabb prioritásszintű engedélyezett megszakítás-kéréseket. Ha talál ilyeneket, kiválasztja közülük a legmagasabb prioritás-szintűt, és megszakítást hajt végre erre a szintre. Az állapotjellemzők cseréje most oly módon zajlik le, hogy a megszakított program állapotjellemzői a főtárnak a megszakított szinthez tartozó kijelölt területén tárolódnak, majd az új szinthez tartozó, szintén kijelölt területről új állapotjellemzők töltődnek be. Még egy fontos különbség az első változathoz képest: az elfogadott kérés jelző-flipflopja csak az őt feldolgozó megszakító program végén törlődik egy speciális dezaktiváló utasítás hatására. Elindul tehát az új szint megszakító programja, és addig fut, míg vagy nálánál is magasabb szintű engedélyezett kérés be nem érkezik időközben (ekkor az ismertetett algoritmus ismét lejátszódik), vagy a megszakítás feldolgozása be nem fejeződik. Ekkor a már említett dezaktiváló utasítás hatására törlődik a feldolgozott kérés jelző flipflopja, és ismét működésbe lép a kiválasztó logika. Megkeresi a jelző flipflopok és az aktív maszkszó alapján a legmagasabb prioritásszintű engedélyezett kérést (ez a szint most biztosan alacsonyabb a jelenleginél), és a már leírt módon "megszakítást" hajt végre a kiválasztott szintekre. Hogy ezzel az algoritmussal az alapállapotban futó program is visszakaphassa a vezérlést, az alapállapotot a legalacsonyabb megszakítási szintnek tekintik, amelynek állandóan, nemtörölhetően és nem-kimaszkolhatóan fennáll a megszakítás-kérése. Az ismertetett elv szerint működik például a Videoton R-10 számítógép megszakítási rendszere. 11/15
1 1 -e s m e g s z a k ítá s i s z i n t 2
2 2 -e s m e g s z a k ítá s i s z i n t
3 3 -a s m e g s z a k ítá s i s z i n t
N o r m á l p r o c e s s z o r -á l l a p o t 1 E n g e d é l y e z e tt m e g s z a k ítá s ké ré s e k
2 3
Je lm a g y a rá z a t p r o g r a m m e g s z a k ítá s p r o g r a m fo l y ta tá s
p r o g r a m á l l a p o tv á l tá s (a m e n té s -b e tö l té s i d ő i g é n y é t s z e m l é l te ti a v a s ta g s á g ) a m e g s z a k ító r u ti n b e fe j e z ő d é s e Az elmondottaknak megfelelően példánkban a következő történik: a 2-es és 3-as forrás egyidejű bejelentkezése után a kiválasztó logika rögtön a 2-es szintre szakít meg. Itt zajlik le a 2-es ok feldolgozása az 1-es forrás bejelentkezéséig, amikor is megszakítás történik az 1-es szintre. Az 1-es ok feldolgozása végén a dezaktiváló utasítás visszaadja a vezérlést a 2-es szintre, a 2-es ok feldolgozása végén pedig átadja a 3-as szintre. Végül a 3-as ok feldolgozása végén a dezaktiváló utasítás visszaadja a vezérlést az alapállapotban futó programnak. Esetenként a megszakítási források száma száznál több is lehet Ha minden forráshoz külön szintet rendelünk, az nagyon megdrágíthatja a gépet. Ezért gyakran csak a megszakítási források egy-egy osztályához rendelünk külön szinteket. Lényegében ilyen az IBM 360-as gépcsalád és az ESZR gépek megszakítási rendszere. Ennek hátránya lehet, hogy ha valamelyik osztály szintjén egy megszakítás feldolgozása folyik, akkor egy ugyanazon osztályba tartozó, de feldolgozás alatt állónál magasabb prioritású megszakítás-kérés várakozni kényszerül (elsősorban az I/O okok osztályára gondolunk. A működési mechanizmust a következő példa szemlélteti: Példánkban tételezzük fel, hogy a prioritási sort a szintek (osztályok) között az 1-es jelű osztály, az osztályokon belül a ..../a jelű forrás vezeti, továbbá hogy a kiválasztó logika a többszintű megszakítási rendszereknél bemutatott első algoritmus szerint dolgozik: a jelenleginél magasabb szintű engedélyezett kérések közül kiválasztja a legalacsonyabb szintűeket, és ezen osztályon belüli kérések közül a legmagasabb prioritásút elfogadva megszakít. A megszakított szint állapotjellemzői az új szinten tárolódnak. Az új szinten a kiválasztó logika mindenekelőtt megpróbálja megismételni ezt az eljárást. Ennek megfelelően példánkban a 2/b, a 3/a és a 3/b források egyidejű bejelentkezésekor először a 3/a forrás szerint történik megszakítás a 3-as szintre, majd - feltéve hogy ennek maszk-szava engedélyezi - azonnal tovább a 2/bn
6
12/15
1 /c 1 -e s m e g s z a k ítá s i s z i n t 2 /b
2 /b 2 /a
2 -e s m e g s z a k ítá s i s z i n t 3 /a
3 /b
3 -a s m e g s z a k ítá s i s z i n t
N o r m á l p r o c e s s z o r -á l l a p o t 1 /c E n g e d é l y e z e tt m e g s z a k ítá s ké ré s e k
2 /a
2 /b 3 /a 3 /b
Je lm a g y a rá z a t p r o g r a m m e g s z a k ítá s p r o g r a m fo l y ta tá s p r o g r a m á l l a p o tv á l tá s (a m e n té s -b e tö l té s i d ő i g é n y é t s z e m l é l te ti a v a s ta g s á g ) a m e g s z a k ító r u ti n b e fe j e z ő d é s e
Összefoglalás A megszakításoknak tehát az a lényege, hogy csak akkor foglalják le a processzor figyelmét, ha arra valóban szükség van. Miután a processzor munkaidejének csak töredékét teszik ki azok az esetek, amikor külső kapcsolatokkal kell foglalkoznia, a megszakítások rendszere felszabadítja a processzort a külső érintkezési pontok időt rabló és fölösleges figyelésétől. Másrészt viszont, amikor külső kapcsolatot kell lekezelni, vagyis megszakító jelet kap, késlekedés nélkül, azonnal reagálhat. Az alprogram-hívás és a megszakítás közti különbség Egy számítógépes program futása alapvetően szekvenciális. Amennyiben a program futása során ettől el kívánunk térni, vezérlésátadó vagy alprogram-hívási utasításokat használunk. Megjelenési formáját tekintve a megszakítások leginkább az alprogram-híváshoz hasonlíthatóak: az alprogram az őt hívó a megszakított program és a főprogram számára végez megszakítást feldolgozó program valamilyen teékenységet teljesen független egymástól (a megszakítást esetleg egy egészen más felhasználó programja Különbség okozta) a hívása a program alapján előre tipikusan véletlenszerű látható az alprogram teljes egészében a megszakítás kiszolgálásában szoftvert jelent jelentős szerepet vállal a hardver is A sínfoglalás és a megszakítások közti különbség A sínfoglalás és a megszakítások megvalósítása ugyanazon három féle módszerrel történik: Soros Hardver lekérdezése (daisy chain) Szoftver lekérdezéses (software polling) 13/15
Párhuzamos Párhuzamos kiszolgálású megszakítási rendszer (independent requesting) Ez önmagában is félreértésekre adhat okot. Ezen túlmenően mindkettő szorosan kapcsolódik a perifériák kiszolgálásához, hiszen pont a megszakításos I/O az elterjedt. Egy periféria megszakítással jelzi az átviteli igényét a processzor felé. Annak érdekében, hogy azonosítsa magát a legelterjedtebb vektoros átvitel esetén általában el kell kérnie a sínhasználati jogot a sínvezérlőtől s azon el kell küldenie a processzor számára a vektorát, mely tartalmazhatja az azonosítóját, vagy a kiszolgálási rutinjának címét, esetleg a kiszolgálási rutin futásához szükséges egyéb állapotadatokat. Miután a processzor megtudta, hogy ki is kérte a megszakítást, akkor processzor a megszakítás feldolgozása során beolvassa az adott periféria állapotregiszterét, melyből látja, hogy az adott egység megszakítását kiszolgáló programnak melyik alprogramját kell futtatnia. Például egy hajlékonylemez egység esetén, ha nincs lezárva a meghajtó (az állapotregiszter READY bitje nincs beállítva), akkor kiírja a képernyőre, hogy az adott egység nincs készenléti állapotban és egy operátori beavatkozásig megszakítja a program futását. Amennyiben viszont az adott egység állapotregiszterében a READY bit be van állítva, akkor az átvitel szervezését végző alprogram fog futni. Magának az átvitelnek a szervezését már inkább az egység végzi, mint a processzor. Az egység kéri a az átvitelhez szükséges sínhasználatot a sínvezérlőtől, s amikor azt megkapja, az egység lép fel az ADÓ (vagy master) szerepében. Nézzük meg más metszetekben is a két feladat eltérő jellegét: 1. Két teljesen különböző célú dologról van szö. Sínfoglalásnál a megosztott sín haasználati jogáért küzdenek az egyes egységek, míg megszakításnál a processzort kérik, hogy az ő problémájukat kiszolgáló programot, utasításokat futtassa la, mégpedig soron kívül. Minél hamarabb: 2. Más a kéréseket adó egységek köre. Sínfoglalásnál csak a kommunikáló perifériák, processzor és memória jöhet számításba, míg a megszakítást okozó egységek száma bővebb, itt már megjelenik az aritmetikai egység, a tápegység, stb. 3. Két, különböző hardver valósítja meg őket. A sínfoglalást a sínvezérlő, a sínarbiter fogja össze és a BUS BUSY, BUS REQUEST valamint az egy vagy több BUS GRANT vezérlővonal vesz részt benne. A megszakítást viszont a megszakítás-vezérlő irányítja az INTR valamint az INTACK vezérlővonal részvételével.
Megszakítások a gyakorlatban Intel példa: 8259A megszakítási vezérlő Az első PC-k Az Intel processzoroknak mindössze 2 db megszakítási vonaluk van, az egyik a Non Maskable Interrupt, az NMI (amihez csatlakoztatták például memória paritás:hiba, tápellátási hiba megszakításait), a másik vonalon pedig osztozik az összes többi megszakítás. Annak érdekében, hogy megnövelje a megszakítási rendszer lehetőségeit, az IBM 1981-ben kiválasztotta az Intel 8259A jelzésű megszakítás-vezérlőt, s ez napjainkig is szabványossá vált. Ez 8 db megszakítást képes kiszolgálni, mégpedig 8 prioritási szinten. Az IRQ0-tól IRQ7-ig sorszámozott megszakítások esetén az IRQ0 prioritása a legmagasabb, az IRQ7-é pedig a legalacsonyabb. Az IBM PC AT Az AT megjelenésekor a 8 prioritási szint már kevésnek bizonyult, ezért az IBM 2 db 8259A vezérlő kaszkádba kötése mellett döntött: az hozzáadott vezérlő kimenetét rákapcsolták a már meglévő vezérlő IRQ2-jéhez. A meglévő vezérlő kimenete az (NMI-t nem számítva) egyetlen megszakítási vezérlővonalon keresztül pedig csatlakozik a CPU-hoz. A kaszkádosítás eredményeképpen 2x8-1= 15 megszakítást tudunk kezelni (a kaszkádosításra elhasználunk egy bemenetet, ezért nem 16). PCI-sín A PCI megváltoztatja a meszakítási struktúrát és saját megszakítási vezérlést épít be a PCI bridge-be. A PCI rendszernek négy megszakítási vezérlővonala van, melyek mindegyike egy-egy bővítősínt szolgálhat ki. A PCI koncepció szerint az ISA bővítősín csak a PCI bridge-n keresztül kommunikálhat a mikroprocesszorral. A PCI tervezői kialakítottak egy úgynevezett sorosított megszakítás-támogató rendszert Serialized IRQ Support for PCI Systems), mely egy úgynevezett IRQSER jelen alapul. Ebben egymás után jelölik, hogy mely megszakításhoz tartozik és melyikhez nem tartozik megszakítás-kérés. 14/15
Ezt az információt eljuttatja a mikroprocesszor chipsetében lévő hagyományos Intel 8259A jelzésű megszakításvezérlőhöz vagy annak funkcionális megfelelőjéhez. S a vezérlőt elérve a megszakítások kezelése már hagyományos módon történik. A megszakítások megosztása A 15 megszakítási lehetőség nem elegendő, ezért már az ISA sín esetén lehetővé tették a megszakítások megosztását. Amikor megosztanak egy megszakítást, akkor minden, az adott megszakítást használó egység ugyanazt a megszakítást használja, hogy jelezze a mikroprocesszor számára a megszakítási igényét. Ezután vagy a megszakítást kiszolgáló szoftver vag pedig a firmver irányítja a mikroprocesszort, hogy a csoportból a megszakítást ténylegesen kérő egység igényét szolgálja ki. A megszakítások kiosztása Mind a 8, mind pedig a 15 megszakításos esetre az IBM adott egy hozzárendelési táblát, hogy mely egységet mely megszakításhoz kössünk. A mai modern PC-k és operációs rendszerek világában a Plug and Play szabvány mellett a következő öt megszakítás hozzárendelése kötött csupán: Példa az IBM PC-nél alkalmazott hozzárendelésekre: A megszakítás száma IRQ0 IRQ1 IRQ2 IRQ8 IRQ9 IRQ13
Funkció timer output 0 billentyűzet kaszkád (a 15-be nem számítjuk be) real time clock video, hálózati adapter lebegőpontos processzor
Logikus, hogy a maszkolható megszakítások közül a legmagasabb prioritást a Timernek kell adni, hogy az órajelet minden körülmények közepette biztosítsa. Mivel személyi számítógépről van szó, ennek illik azonnal reagálni a billentyűzet-leütésre, ezért rendelték a második legmagasabb prioritási szinthez a billentyűzetet. Tehát 10 db megszakítással szabadon gazdálkodhatunk, a lényeg csupán, hogy mind a hardver egység, mind pedig a megszakítást kezelő szoftver (azaz a hardver egység megható szoftvere) tudja, hanyas számú megszakítást választottuk ki. A megszakítások listájának megtekintése a Win95-ben A megszakítások egyes egységekhez való hozzárendelését egy Win95-ös operációs rendszer esetén megtekinthetjük a System ikonból kiválasztva a Control Panelt, majd a Device menüben kiválasztjuk az Interrupt requestet.
15/15