megszakításkezelõkben
A funkció, amely végrehajtja a magot adott válaszként megszakítási nevezik megszakítás kezelő (megszakítás kezelő) il-csoport és a megszakítás kiszolgáló rutin (ISR). Minden eszköz, amely generál megszakítást megfelel egy megszakítás-kezelőre. Például, egy funkció kezeli megszakítja a rendszer időzítő, és a többi - megszakítást által generált billentyűzetet. Egy megszakítás kezelő egy eszköz része egy eszközmeghajtó - kernel kód, amely ellenőrzi a készülék.
A Linux operációs rendszer megszakítja rakodók - ez normális funkcióit. C-ben írt programozási nyelv, és meg kell felelnie bizonyos technika állása a kernel szabványos módon információt kapni a processzor, de ostalnom- normális funkcióit. Az egyetlen dolog, ami megkülönbözteti a megszakításkezelõkben egyéb alapvető funkciók - ez az, amit ők nevezik a kernel válaszul a megszakítás, és fut egy különleges környezetben, az úgynevezett megszakítás összefüggésben (interrupt összefüggésben), ami lesz szó később.
Mivel egy megszakítást is előfordulhat bármikor, akkor -kal, és a megszakítás kezelő hívható bármikor. Nagyon fontos, hogy a megszakítás kezelő nagyon gyors, és folytatta az irányítást a megszakított kódot a lehető leggyorsabban. Ezért, bár a hardver, és fontos, hogy a megszakítási szolgálják fel azonnal, fontos, hogy a többi rendszer megszakítására felvezető végre a lehető legrövidebb időn belül. A lehető legkisebb munkát, hogy köze van egy megszakítás kezelő -, hogy küldjön egy megerősítő eszköz, megszakítás érkezik. Általában azonban megszakításkezelõkben végre kell hajtania több munkát. Vegyük például egy megszakítás kezelő a hálózati eszköz. Együtt küldte meg a hardver, a megszakítás kezelő kell másolni a hálózati csomagokat egy hardver eszköz a rendszer memóriájában, feldolgozására, küldje el a megfelelő protokoll vagy a megfelelő programot. Nyilvánvaló, hogy ez megköveteli a sok munka.
A felső és alsó felét
Nyilvánvaló, hogy ez a két követelmény, hogy a megszakítás kezelő kell végezni és gyorsan, ráadásul, hogy végezzen egy csomó munka, ellentmondásosak. Mivel a ellentmondó követelmények, a megszakítás kezelő oszlik két részre, vagy fél. Megszakítás kezelő a felső fele (felső fele) - ez azonnal megtörténik vételét követően a megszakítás és végrehajt egy munka, kritikus időben késleltetve, mint a küldő átvételi elismervényt a megszakítás vagy állítsa vissza az eszközt. A munka kerül végrehajtásra később, lerakódik, mielőtt az alsó (vagy primer) a felét (alsó fele). Az alsó felében feldolgozása később, egy alkalmasabb időben, amikor minden megszakítás engedélyezve van. Elég gyakran, az alsó fele kerül végrehajtásra után azonnal vissza a megszakítás kezelő.
Az operációs rendszer nyújt a különböző végrehajtási mechanizmusok, a feldolgozás az alsó részből áll, melyeket tárgyalt 7. fejezet, „kezelése az alsó fele és a halasztott lépéseket.”
Tekintsük a példa egy megszakítás-kezelőre elválasztására a felső és alsó felét keresztül öreg NIC. Amikor a hálózati adapter fogadja a bejövő csomagokat a hálózat, akkor értesítenie kell a kernel hogy a rendelkezésre álló új adatok. Ezt meg kell tenni annak érdekében, hogy azonnal, hogy az optimális sávszélesség és a késleltetés adatátvitelre a hálózaton keresztül. Ezért egy megszakítás generálódik azonnal: „Hé, vannak friss kernel csomag!. Kernel reagál végző bejegyzett megszakítás kezelő a hálózati adaptert.
Egy megszakítás kezelő lefut, hardver irányítva elismervényt csomagok átkerülnek a központi memória, és ezt követően az AC adapter fogadására kész új csomagokat. Ez a feladat egy fontos és kritikus a végrehajtási idő és egyedi minden típusú hardvert. A többi hálózati csomag feldolgozását végzik később - az alsó felét megszakítás kezelő. Ebben a fejezetben figyelembe vesszük a feldolgozás a felső felét, és a következő - alacsonyabb.
Regisztráció megszakítás kezelő
megszakítja rakodók feladata a illesztőprogramokat kezelni egy adott típusú hardvert. Minden eszközmeghajtó csatlakoztatva van, és ha a készülék egy megszakítás (és leggyakrabban használt), a vezetőt el kell végeznie a regisztráció a megszakítás kezelő.
A vezető regisztrálja megszakítás kezelő feldolgozására meghatározott vonalon az alábbi funkciókat.
/ * Request_irq: allokálná interrupt * /
int request_irq (unsigned int irq,
irqreturn_t (* felvezető) (int, void *, struct pt_regs *), előjel nélküli hosszú hiba irqflags,
const char * devname,
Az első paraméter, irq. pont rendelt megszakítás száma. Bizonyos eszközök, például, például egy hagyományos személyi számítógépek, az időzítő és a billentyűzet, ez az érték általában mereven rögzítve. A legtöbb más eszköz, ezt az értéket úgy határozzuk meg, tesztelés (próba) vagy más dinamikus módon.
A második paraméter, felvezető. - a mutató egy funkciója a megszakítás kezelő szolgál ez a megszakítás. Ez a funkció kerül meghívásra, amikor az operációs rendszer jön megszakítás. Felhívjuk a figyelmet, hogy egy adott prototípus a felvezető. Ez három paramétert és értéket ad vissza irqreturn_t típusát. Később ebben a fejezetben tárgyaljuk részletesebben a funkciót.
A harmadik paraméter, irqflags. Ez lehet nulla, vagy tartalmazhat egy bitmaszk egy vagy több alábbi zászlók.
• SA_INTERRUPT. Ez a zászló azt jelzi, hogy a megszakítás kezelő - a bystryyobrabotchikpreryvaniya. Istoricheskitakslozhilos, chtooperatsionnaya Linux rendszer megkülönbözteti a lassú és gyors megszakításkezelõkben. Várható, hogy a leggyorsabb processzor gyors, de potenciálisan nagyon gyakran, ezért a viselkedését a megszakítás kezelő módosítjuk, hogy a lehető legnagyobb sebességgel a végrehajtás. Ma csak egy különbség: amikor a gyors megszakítás kezelő letiltja az összes megszakítást a helyi processzor. Ez lehetővé teszi a gyors végén a felvezető gyorsan, és más megszakítások olyan módon, amely nem pometat. Alapesetben (ha ez nincs megadva) lehetővé tette az összes megszakítást, kivéve azokat, maszkos az összes processzort és rakodók, amelyek jelenleg is fut. Mert az összes megszakítást kivéve az időzítő megszakítás nincs szükség beállítani ezt a zászlót.
• SA_SAMPLE_RANDOM. Ez a zászló azt jelzi, hogy a megszakítás által generált ez a készülék, hozzá kell járulnia a kernel entrópiatárolóba. Kernel entrópiatárolóba biztosít generációs valódi véletlen szám alapján különböző véletlenszerű események. Ha ez a jelző meg van adva, az idők, amikor jönnek megszakítás, bevezetésre kerül a entrópiatárolóba. Ez a zászló nem lehet beállítani, ha a készülék generál egy megszakítást kiszámítható időpontokban (mint például a rendszer timer) vagy külső támadó eszköz (például egy hálózati eszköz) lehet befolyásolni. Másrészt, a legtöbb eszköz generál megszakítások előre nem látható időpontokban, és ezért jó forrásai az entrópia. A részletesebb leírást a kernel entrópiatárolóba látni. B. függelék, „A véletlenszám-generátor a mag.”
• SA_SHIRQ. Ez a zászló azt jelzi, hogy a szám a megszakítások lehet osztani több megszakítási rakodók (megosztott). Minden kezelőt, amely be van jegyezve ugyanazon megszakítási vonalat, a zászló jeleznie kell. Ellenkező esetben csak egy megszakítás kezelő létezhet minden vonalon. További információ a megosztott megszakításkezelõkben, olvassa el a következő szakaszt.
A negyedik paraméter, devname, - ez az ASCII-string, amely leírja, hogy milyen eszköz csatlakozik a megszakítás. Például, hogy szakítsa meg a számítógép billentyűzetén, az érték „billentyűzet”. Szó eszköz neveket használnak felhasználói interakció interfészeken keresztül
/ Proc / ir q és / proc / megszakítások. amely hamarosan figyelembe kell venni.
Az ötödik paraméter, Devid. elsősorban a megosztott megszakítás kérés vonalak. Ha a megszakítás kezelő felszabadul (lásd alább), dev_id a paraméter egy egyedi azonosítót (cookie), ami lehetővé teszi, hogy távolítsa el csak a szükséges megszakítás kezelő sort. Ezen opció nélkül lehetetlen lenne meghatározni a kernel, amit megszakítás kezelő a vonalat kell távolítani. Ha a kérés vonal és egy megszakítás nem megosztott, lehetőség van arra, hogy erre a paraméterre jelzik NULL, ha ugyanazt a megszakítás száma megosztott, meg kell adnia egy egyedi azonosítót (cookie) (ha a készülék nem csatlakozik az ISA sár, a legfontosabb, hogy támogatja megosztott megszakítás száma).
Ezt a paramétert is telt a megszakítás kezelő minden hívás esetében. A szokásos gyakorlat - egy mutatót az átviteli eszköz struktúrát (eszköz összefüggésben), mivel ez a paraméter egyedülálló, és emellett, hasznos lehet, hogy van egy mutató ez a struktúra egy megszakítás-kezelőre.
Ha sikeres, a funkció request_ir q () értéke nulla. Nem-nulla érték azt jelzi, hogy hiba történt, és a megadott megszakítás kezelő még nincs regisztrálva. A leggyakoribb hiba kód - -EBUSY ezt az értéket, ami azt jelzi, hogy a megszakítási kérés vonal már foglalt (és vagy az aktuális hívás vagy az első hívás nem volt megadva SA_SHIRQ zászló).
Meg kell jegyezni, hogy a request_ir q () függvény alvó üzemmódban van (alvás), és ennek megfelelően nem nevezhető megszakítás környezetrõl, illetve egyéb esetekben, amikor a kód nem lehet blokkolni. Gyakori hiba a meggyőződés, hogy request_irq () függvény, akkor nyugodtan hívja az esetekben, amikor nem lehet bemenni tétlen állapotban van. Ez részben abból a tényből, hogy tényleg csak nem értem, miért a funkció request_irq () kell várni semmit. A dolog. hogy a regisztrációs zajlik hozzáadásával információt a megszakítási vonalat a / proc / irq. proc_mkdir () függvényt, hogy új elemeket a fájlrendszerben procfs. Ez a funkció felhívja proc_creat e () függvényt, hogy új elemeket procfs fájlrendszer. amely viszont előidézi kmalloc () funkció segítségével a memóriát. Amint lesz látható 11. fejezet, „Memory Management”, kmalloc () mehet be tétlen állapotban van. Ez hogyan!
A regisztrációhoz vonal megszakítás kezelő és illesztőprogram telepítése a kódot, akkor a következő hívást.
if (request_irq (irqn, my_interrupt, SA_SHIRQ "my_device" dev))
printk (KERN_ERR "my_device: nem lehet regisztrálni IRQ \ n.", irqn);
Ebben a példában a paraméter IRQ n - egy kérés a kért megszakítás sorszám, amelyben my_interrup t - van a sor processzor megszakítás kérés vonal egy megszakított lehet osztani, az eszköz neve - „my_device” dev - dev_id paraméter értékét. Abban az esetben, egy hibakódot kiírja az üzenetet, hogy hiba lépett fel, és visszatér a funkciót. Ha a naplózás függvény a nulla értéket, a megszakítás kezelő telepítése sikeresen befejeződött. Ettől a pillanattól kezdve a megszakítás kezelő kerülnek meghívásra válaszolva egy bejövő megszakítás. Fontos, hogy inicializálja a készüléket, és ellenőrizze a megszakítás kezelő a megfelelő sorrendben, hogy megakadályozzák a lehetőségét, hogy egy híváskezelő mindaddig, amíg a berendezés nem inicializált.
Mentesség megszakítás kezelő
Ahhoz, hogy felszabadítsuk a megszakítási vonalat kell hívni egy függvény
void free_irq (unsigned int IRQ, void * dev_id)
Ha a megadott vonal nem osztott, ez a funkció eltávolítja a felvezető és letiltja interrupt. Ha megszakítás kérés vonal van osztva, majd eltávolítjuk felvezető megfelelő dev_id paramétert. kéréssor interrupt is tilos, ha eltávolítják az utolsó felvezető. Most már értem, hogy miért fontos, hogy továbbítja az egyedi érték dev_id paramétert. Ha a megosztott megszakítás szükséges egyedi azonosító megkülönböztetésére társul egy megszakítás száma eltér egymástól rakodók és egyéb funkciók free_irq (), hogy törölje a megfelelő kezelő. Mindenesetre mentes paraméter értéke nem egyenlő NULL, akkor meg kell felelnie a felvezető, amelyet el kell távolítani.
Hívjon free_irq () függvény kell végezni a folyamat keretében.
6.1. Listakezelés megszakítás funkció regisztráció
request_ir q () meghatározott nyilvántartás, megszakítás kezelő egy adott interrupt
f ree_ir q () engedje el a megadott megszakítás kezelő. Ha egy interrupt már nem jár semmilyen egy processzor, a tilalom meghatározott megszakítási vonalat