A perifériák kezelése



Egy számítógép önmagában céltalan eszköz lenne, mindenképpen szüksége van a külvilággal való kapcsolattartásra: adatokat kér be, információkat ír ki. Ezeket a perifériák segítségével hajtja végre, melyek vezérléséért a perifériavezérlő felelős.
A perifériavezérlő a CPU-val és memóriával a buzokon keresztül tartja a kapcsolatot, míg a perifériákkal külön vezérlővonalak kötik össze. Itt kell megemlítenünk, hogy a számítógép egyes feladataiért felelős kártyák is igénybe veszik a perifériavezérlő szolgáltatásait, bár ezek többnyire a buszokon is képesek közvetlenül kommunikálni.


 
A perifériák címzése

Fontos megvizsgálnunk azt, hogy a CPU hogyan tudja elérni a perifériavezérlőt, illetve a különböző perifériákat, vezérlőket, bővítőkártyákat. A processzor (akárcsak a memóriának) adatokat küld (ír) a vezérlőből, illetve olvas onnan. Ezeket az adatokat a vezérlő regiszterei tárolják. A regisztereket úgy kell elképzelnünk, mint a memória rekeszeit. Minden regiszternek van egy címe, ezt a címet helyezi a CPU a címbuszra, és olvasáskor a megcímzett regiszter tartalmát leolvassa az adatbuszról, illetve íráskor ráhelyezi arra. Honnan tudja a perifériavezérlő, illetve a memória, hogy most a címbuszra helyezett címet neki kell feldolgozni, tehát hozzá fordult-e a CPU? A problémára többféle megoldási módszert is kidolgoztak:

Az I/O címzés: Ilyenkor a vezérlőbusz egyik vonala (I/O) jelöli ki, hogy a címbuszon található címre a memória vagy a periféria reagáljon.

Leképezett memória:
Adott címtartományt leképezik a memória adott címtartományára, tehát ezeken a CPU a perifériát (bővítőkártyát) éri el. (Ha ezeken a címeken fizikai memória is elérhető lenne, akkor az vagy nem lesz elérhető, vagy a rendszer más címekre helyezi át.) Néha nagyon nagy címtartományokat kell kihasítani a rendszermemória tartományából, ilyen például a videokártya memóriatartománya.

A következő ábrán egy tipikus memóriakiosztás látható:

memoriakezeles

 

Azt a kérdéstt tehát már megválaszoltuk, hogy a CPU hogyan éri el a perifériákat. De maradt még két kérdés: Hogyan jelzik a perifériák a CPU felé az igényeiket, illetve hogyan érhetik el a memóriát?


 

Megszakításkezelés

Az eddigiek szerint a számítógép működése abból áll, hogy a processzor szolgaian olvassa ki a memóriából az utasításokat, az operandusokat, végrehajtja azokat, majd veszi a következőt, és így tovább. Mozdítsuk meg az egeret. Az egérkurzor elmozdul a képernyőn. Honnan vette észre a processzor, hogy most az egér programját kell végrehajtania? A megoldás a megszakításokban rejlik. A perifériakezelőben található egy megszakításkezelő, mely kapcsolatban áll azokkal a perifériákkal, bővítőkártyákkal, hardver elemekkel, melyek meghatározott feladatokat hajtanak végre a számítógépben. (Billentyűzet, egér, USB, hangkártya, rendszeróra, stb.) Minden ilyen eszközhöz egy-egy sorszám van rendelve. A kezdetekben ez még kötött volt, a mai gépeknél már nem tartják magukat ehhez.
 
Alapértelmezett 
megszakítási sorszámok
IRQ 0 Rendszer időzítő
IRQ 1 Billentyűzet
IRQ 2 Másodlagos megszakításvezérlő
IRQ 3 Alapértelmezett COM2 és COM4 port
IRQ 4 Alapértelmezett COM1 és COM3 port
IRQ 5 LPT2 port
IRQ 6 Hajlékonylemez vezérlője
IRQ 7 LPT1 port
IRQ 8 Rendszeróra
IRQ 9 Szabadon felhasználható
IRQ 10 Szabadon felhasználható
IRQ 11 Szabadon felhasználható
IRQ 12 PS/2 egér vagy szabad
IRQ 13 Matematikai társprocesszor
IRQ 14 Elsődleges merevlemezvezérlő
IRQ 15 Másodlagos merevlemezvezérlő

Meg kell jegyezni, hogy a mai alaplapokra egy továbbfejlesztett megszakításvezérlő áramkört szerelnek (APIC, Advanced Programmable Interrupt Controller), amely IRQ16-IRQ23 közötti szabadon felhasználható sorszámok kiosztását is lehetővé teszi. A szabadon felhasználható sorszámokhoz lehett a hangkártyát, különböző vezérlőkártyákat, stb. rendelni.

irqtable

Minden eszközhöz tartozik értelemszeűen egy-egy program, mely az eszközt kiszolgálja. (Tehát ha az eszköz megszakítást generál, a hozzá tartozó programot kell lefuttatni.) Ezeket a programokat a gép indulásakor az operációs rendszer betölti a memóriába (illetve némelyik a BIOS-ban van, hiszen még az operációs rendszer betöltése előtt is használhatjuk a billentyűzetet, merevlemezt, stb.). A betöltött programok kezdőcímét nevezzük megszakítási vektornak, és azt a táblázatot, mely tartalmazza ezeket a címeket, megszakítási vektortáblának.

Egy megszakítás kérésének kiszolgálása a következők szerint megy végbe:

  1. A megszakítást igénylő eszköz jelez a megszakításvezérlőnek.
  2. A megszakításvezérlő jelez a CPU-nak.
  3. A CPU befejezi az éppen végrehajtás alatt álló utasítást, majd az állapotát elmenti a memória egy kitüntetett területére, a verembe. (Ide kerülnek lementésre az adat és állapotregiszterek tartalma, a címregiszterek tartalma, különös tekintettel az utasításszámlálóra, mely azt a címet tartalmazza, ahonnan a CPU-nak majd folytatni kell a megszakított programot.)
  4. A CPU visszajelez a megszakításvezérlőnek.
  5. A megszakításvezérlő elküldi a CPU-nak a megszakítást igénylő eszköz sorszámát.
  6. A CPU beolvassa a megszakítási vektortáblából az ehhez a sorszámhoz tartozó megszakítási vektort, és lefuttatja az ezen a címen található programot. (Tehát elindítja az eszközt kiszolgáló programot.)
  7. Miután befejezte a programot, kiolvassa a veremből az elmentett állapotot, és aszerint folytatja a félbehagyott programot.
Lehetőség van megszakítások maszkolására, ami annyit jelent, hogy a megszakításvezérlő a megszakítási kérelmet a maszkolt megszakításnál nem továbbítja a CPU-nak. (Tehát a maszkolt eszköz nem kerül kiszolgálásra.)
Előállhat az az eset, hogy a CPU éppen kiszolgál egy megszakítást, és ilyenkor érkezik egy újabb, egy másik eszköztől. Mi történik? A megszakítások prioritása határozza meg, hogy melyik megszakítás kiszolgálását melyik másik szakíthatja meg.

Az eddig felvázolt megszakítást hardveres megszakítsának is nevezzük, mivel a folyamatot egy hardver elem váltja ki.

Létezik az úgynevezett szoftveres megszakítás is, mely egy utasítás hatására váltja ki a ugyanezt a folyamatot (pl. INT 134), csak értelemszerűen ehhez nem kell a megszakításvezérlő. A szoftveres megszakítás folyamatát a fentebb leírt 3.-7. lépések végrehajtása jelenti. Szoftveres megszakításokkal tipikusan a BIOS vagy a DOS szolgáltatásait érhetjük el. Ilyenek lehetnek például az INT13h (h=hexadecimális) a lemezegységek, az INT10h a képernyő, az INT14h a sorosvonalak kezelését végzi, az INT11h-val a konfiguráció, míg az INT12h-val a memória mérete kérdezhető le. A DOS szolgáltatásait egységesen az INT21h szoftveres megszakítással érhetjük el, ilyenkor a szolgáltatások azonosítása a regiszterekkel jelölhető ki. (Például az INT21h meghívása előtt, ha az AH regiszterbe a 30h hexadecimális értéket töltjük a DOS a saját verzióját, míg ha a 2Ah értéket, akkor a rendszerdátumot adja vissza. Persze a mai Windows-os világban ezeket már nem használjuk.

A processzor rendelkezik egy olyan megszakítást igénylő bemenettel is, amelyet nem lehet lemaszkolni, ennek az elnevezése: NMI (Non Maskable Interrupt).

Lehet-e egyetlen sorszámhoz több különböző eszközt is rendelni? Első gondolatra nem, hiszen egy sorszámhoz csak egy vektor tartozhat, vagyis csak egy program, annak meg kicsi a valószínűsége, hogy ugyanaz a program szolgál ki két eszközt is. A mai rendszerekben viszont már lehetséges, mert a közös sorszámot használó eszközöknél egy olyan programot futtat le a CPU, melyben lekérdezi ezeket az eszközöket, hogy melyik is okozta a megszakítást.

Megszakítás nélkül is működhetne az élet, ha a CPU időnként (no jó, ehhez az időnkénthez kell az óramegszakítás) körbekérdezi (ennek a neve pooling) az összes eszközt, hogy van-e valami igénye. (Mintha 5 percenként kimennék a bejárati ajtóhoz, hogy áll-e valaki kint. Kényelmesebb az ajtócsengő használata.)

A megszakítások konfigurálása

Már csak egy kérdés maradt, hogyan rendeljük az eszközökhöz a megszakítási sorszámokat, tehát hogyan konfiguráljuk a megszakítást.

A számítástechnika fejlődésével három módszer alakult ki:

  • hardveres - a felhasználó állítja be
  • szoftveres - a felhasználó állítja be
  • szoftveres - a BIOS vagy az operációs rendszer állítja be

Az első esetben magukon az eszközökön állítottuk be a megszakítási sorszámot. Mivel ez akkoriban egy 0 és 15 közötti szám volt, négy bitre vagy  4 darab kétállású kapcsolóra volt szükség. A kapcsolók bonyolultsága miatt később bevezették a jumper használatát, amei nem volt msá, mint két kiálló tű, melyre ha ráhúztuznk egy "sapkát", akkor rövidrezárta a tűket, így különböztetve meg a 0 és 1 állapotot. Természetesen a felhasználónak kellett megjegyeznie, hogy melyik eszköz melyik IRQ-t használja, és csak a szabad IRQ-kat állíthatta be, különben un. IRQ ütközés állt elő.

dipswitch

jumper2

 

A második esetben már nem kellett csavarhúzó, csipesz a beállításhoz, mivel az adott eszköz (pl. hangártya) programjának lehetett megmondani, hogy milyen IRQ-val működjön. Azonban ezt is a felhasználó írta be, tehát figyelni kellett az ütközésekre. A következő képen a SET BLASTER sorban van megadva szoftveresen a megszakítás sorszáma (I7).

 

setblasterirq

 

A harmadik esetben már vagy a BIOS, vagy az operációs rendszer rendelte az eszközhöz az IRQ-t, és ezek már gondoskodtak az ütközések elkerüléséről. Az így beállítható kártyákat neveztük plug&play eszközöknek.

 


Adatok átvitele a memória és a periféria között (PIO és DMA)

Már csak egy kérdés vár megválaszolásra, hogyan küldhet át adatokat a periféria a memóriának, illetve viszont. Igazából az eddig tárgyaltak elegendőek a probléma megoldására, a periféria megszakítással jelzi a CPU felé, hogy munka van, a CPU pedig kiszolgálja a kérést, és pl. I/O címzéssel kiolvassa a perifériából az adatot, majd kiírja a memóriába. Ha sok az adat, sokszor csinálja meg a műveletet. Az ilyen adatátvitelt nevezzük PIO (Programmed Input/Output, Programozott ki/bemenet) A probléma az, hogy egy ilyen egyszerű művelet végrehajtásához nem kellene igénybe venni a CPU-t, hanem a perifériavezérlő is megoldhatná az adatok mozgatását közvetlenül a periféria és a memória között a CPU kihagyásával. A művelet neve a DMA (Direct Memory Access, Direkt memória elérés), az érte felelős áramkör a DMA vezérlő.

Mind a PIO, mind a DMA különböző fejlődési szinteket ért el, a cél mindvégig az volt, hogy egyre nagyobb sebességgel lehessen az adatokat másolni. Természetesen nem csak a perinfériavezérlőt (DMA vezérlő) kellett fejleszteni, hanem a perifériákat (illetve főleg a háttértárakat), hogy kihasználhassák a megnövekedett sebességet. Az alábbi táblázatok a különböző fejlettségi szinteket tartalmazzák (DMA módban volt még egy és kétszavas is, de az már történelem...):

PIO Data Transfer Mode / PIO adatátviteli mód
  Maximális áteresztőképesség (MB/s)
PIO Mode 0 3.3
PIO Mode 1 5.2
PIO Mode 2 8.3
PIO Mode 3 11.1
PIO Mode 4 16.6

 

DMA transfer Mode / DMA átviteli mód
  Maximális áteresztőképesség (MB/s)
DMA Mode 0 4.16
DMA Mode 1 13.3
DMA Mode 2 16.6
UltraDMA 33 33.3
UltraDMA 66 66.7
UltraDMA 100 100.0
UltraDMA 133 133.0

 

Kérdések:

  1. Hogyan címezhetők meg a perifériák?
  2. Mutassa be az I/O címzést!
  3. Mutassa be a beágyazott címzést!
  4. Miért van szükség megszakításra?
  5. Mutrassa be egy megszakítás folyamatát!
  6. Mutassa be az alábbi fogalmakat: megszakítási vektor, megszakítási vektortábla, prioritás, maszkolás
  7. Mi a pooling?
  8. Hogyan konfiguráljuk a megszakításokat? Mindegyiket murtassa be 1-1mondattal!
  9. Hogyan mozgathatók az adatok a periféria és a memória között?
  10. Mi a DMA?
  11. Mi a PIO?

 

 

 

 

Advanced Programmable Interrupt Controller

Visit the new site http://lbetting.co.uk/ for a ladbrokes review.