Működése folyamán minden program végső soron nem csinál mást, mint ki- és bemeneti eszközök sokaságán keresztül olvas és ír adatokat. Ezen eszközök egy része az adatok bevitelét (billentyűzet, egér), míg mások az adatok tárolását (merevlemez, memória), vagy éppen megjelenítését (nyomtató, képernyő) teszik lehetővé.

A meghajtóprogramok feladata ezen eszközök és az operációs rendszer, esetlegesen az alkalmazások közti kapocs biztosítása. Az meghajtóknak több fajtáját is megkülönböztetjük attól függően, hogy a rendszer mely részében és milyen céllal kerülnek felhasználásra.
 

Hardver meghajtók
A hardver meghajtók speciális rendszerkomponensek, amelyek mind a hardver, mind a szoftver részének is tekinthetők, hiszen bár az alkalmazásokhoz hasonlóan szoftverként futnak a gépen, azonban a hardverrel (a vezérelt eszközzel) is szoros, funkcionálisan szinte megbonthatatlan egységet képeznek.

A legtöbb hardvermeghajtó az operációs rendszer és az alkalmazások számára a hardver egység funkcióinak elérését, az eszköz vezérlését nem egyedi módon, hanem valamilyen absztrakciós interfészhez történő illesztésen keresztül teszi lehetővé. Az absztrakciós interfészek jelentősége a vezérlési folyamatok rétegezésében van: ezek segítségével válik lehetővé az operációs rendszer és az alkalmazások számára bizonyos magas(abb) szintű funkcionalitás implementálása a mindenkori tényleges hardver eszközök felett, ahol az eszközfüggő műveleteket az adott hardverhez tartozó meghajtóprogramok látják el, az egyedi részleteket és eltéréseket a magasabb szintű rétegek elől elrejtve. Ugyanakkor az absztrakciós interfészek egyben lehetővé teszik az illesztő-felület két oldalán elhelyezkedő komponensek (az operációs rendszer és az alkalmazások, illetve a hardver eszközök) egymástól független cseréjét, tetszőleges kombinálását. Ez az, aminek köszönhetően ugyanaz az alkalmazás és/vagy operációs rendszer több, eltérő belső működésű, de meghajtóprogramokon keresztül azonos absztrakciós interfészhez illesztett hardver egység vezérlését is problémamentesen, azonos módon végezheti. Ugyanezen okból kifolyólag adott esetben a szoftver vagy az operációs rendszer újabb (vagy éppen régebbi) verziói is használni tudják az eredetileg korábbi (vagy éppen újabb) verziókhoz készült meghajtóprogramokat, és ezen keresztül magát a kapcsolódó (hardver) egységet is.
 

Virtuális eszközmeghajtók
A többfeladatos működés az eszközmeghajtók terén is számos olyan megoldandó problémát is felvet, amelyek egyfeladatos környezetben nem is problémák. Ilyen például a rendszerben található hardver eszközök kezelésének feladata is. Hogy ez miért probléma? Nos, azért, mert a többfeladatos rendszerben az egyes alkalmazások egymástól függetlenül, bizonyos értelemben összehangolatlanul teszik a dolgukat. Egyik-másik eszközt több processz is használ (vagy legalábbis használni próbálja) egy időben. A hardver egységeket azonban szigorúan meghatározott rendben, nagyon jól meghatározható körülmények között kell vezérelni, ami centralizált kontrollt tesz szükségessé. A probléma megoldását az eszközök ún. virtualizálása, a virtuális eszközmeghajtók alkalmazása jelenti.

A virtualizálás lényege, hogy az alkalmazások az eszköz funkcióit közvetlenül nem, hanem csakis az eszközmeghajtókon keresztül érhetik el. Ha valamelyik alkalmazás az adott eszköz szolgáltatásait szeretné használni, úgy azt csakis ezen a virtuális interfészen keresztül teheti meg. A virtuális interfész túloldalán maga az eszközvezérlő program "csücsül", aki így a mindenkori működési körülményeknek megfelelően dönthet a kapott feladat végrehajtásáról: az eszközhöz történő hozzáférés biztosításáról vagy éppen ennek megtagadásáról. Párhuzamos hozzáférések esetén a virtuális eszközmeghajtónak minden egyes kliens számára meg kell őriznie az eszköz állapotát, és gondoskodnia kell arról, hogy az eszköz mindig a megfelelő állapotban kerüljön, amikor az adott kliens folytatni kívánja az eszköz vezérlését. Az eszközmeghajtó programok feladata így kettős: egyrészt biztosítaniuk kell az adott egység szolgáltatásainak megosztását, a kapott feladatok szinkronizálását, vagy amennyiben ez nem lehetséges, úgy az egyidejű hozzáférési kísérleteket sikeresen el kell hárítaniuk. Másrészt gondoskodniuk kell az alkalmazások részéről átvett végrehajtandó feladatok kivitelezéséről, azaz maga a hardver-eszköz vezérléséről, programozásáról. A virtuális eszközmeghajtók a hardver vezérlését közvetlenül is elláthatják, vagy ezt a feladatot más szoftver-komponensekre (pl. hardver-meghajtókra) is bízhatják.

A valódi hardvereszközöket leképező virtuális meghajtókon kívül léteznek olyan speciális meghajtók is, amelyek mögött nem áll egy diszkrét fizikai egység, hanem amelyek valamilyen logikai egységet: fájlrendszert, kommunikációs protokollt, vagy éppen egy rendszerobjektumot valósítanak meg. Ezen eszközmeghajtók azonban mind funkcionalitásukban, mind felépítésükben rendkívüli módon hasonlítanak a hardverekhez kapcsolódó eszközmeghajtó programokra - csak éppen előbbiekkel szemben nem hardver eszközöket, hanem más eszközmeghajtókat vezérelnek.
 

Windows NT meghajtók
A Windows NT családba tartozó operációs rendszerekben a meghajtóprogramok (a hardver- és az eszközmeghajtók is) az ún. felhasználó módban futó alkalmazásoktól elválasztva, az operációs rendszer egy külön "szegmensében", az ún. megbízott (trusted) vagy más néven kernel módban (kernel mode) futnak. A rendszer e részében elhelyezkedő programok korlátozás nélkül érhetik el a gép hardver-erőforrásait. Éppen ezért nagyon fontos, hogy itt csakis olyan programok (meghajtók) kerüljenek futtatásra, amelyek rendkívül jól szervezettek és legfőképpen jól teszteltek, amik sem egymással sem a rendszer más komponenseivel nem kerülnek konfliktusba, hiszen az ebben a módban keletkező esetleges programhibák fatálisak következményekkel járnak a rendszer működése szempontjából. (A kernel módban keletkező kezeletlen kivételek eredménye a mindenki által jól ismert "kék halál".) A meghajtóprogramoknak nem csak saját maguknak kell rendkívül "korrekten" viselkedniük, de az alkalmazások (vagy más eszközmeghajtók) felől érkező adatokon is szigorú ellenőrzéseket kell végezniük, mielőtt műveletek végeznek velük. Különösen a mutatókkal és puffer-területekkel kell nagyon óvatosan bánniuk és minden hozzáférési kísérlet előtt ellenőrizniük kell azok érvényességét és a mindenkori hozzáférési jogosultságokat.

A kernel mód ugyanakkor egyben védettséget is jelent az itt futó programok számára, amelyekhez a felhasználói módú alkalmazások közvetlenül nem férhetnek hozzá, tehát nem veszélyeztethetik a rendszer ezen komponenseinek integritását. A gyakorlatban ez olyan szoftver-architektúrák kialakítását teszi lehetővé, amelyek rendkívül stabil rendszert eredményeznek, mert az egyes "rosszindulatú" vagy egyszerűen csak hibás alkalmazások kizárólag önmagukban okozhatnak kárt - más alkalmazások vagy az operációs rendszer alapvető működését nem zavarhatják meg.

A felhasználói módban (user mode) futó alkalmazások közvetlenül nem, hanem csak speciálisan erre kialakított csatornákon keresztül cserélhetnek adatot a kernel módban futó eszközmeghajtókkal. Ezen kommunikációs mechanizmusok összességét szokás eszköz ki-/bemenet vezérlésnek (device I/O control) hívni. Az eszköz I/O valójában nem más, mint a felhasználói és a kernel mód közti adatcserét szabványos keretek közé szorító interfész. Funkcionalitása nem merül ki az adatok a két mód közti ide-oda mozgatásában, hanem egyben elfedi az alkalmazások elől az eltérő operációs rendszer architektúrákból adódó eszközkezelési különbségeket, valamint gondoskodik a ki-/beviteli kérések ütemezéséről is.

Az eszköz I/O csak a keretet biztosítja az alkalmazások és az eszközmeghajtók közötti szabványos adatcseréhez, de önmaga az adatokon semmilyen feldolgozást nem végez.

Az ilyen módon kialakított kliens/szerver architektúrában egy adott eszköz kezelését végső soron mindig két szoftverkomponens együttesen látja el, melyek közül a kliens a felhasználói, míg a szerver rész a kernel részben helyezkedik el. A rendszerben minden egyes processz a kliens modul egy-egy saját példányával rendelkezik, ami teljesen függetlenné teszi az összes többi processztől. Ugyanakkor a szerver modul csakis egy példányban van jelen a rendszerben - minden kliens ugyanahhoz az egyetlen kernel módban futó eszközmeghajtóhoz intézei kéréseit, amelyek ütemezéséről az I/O kezelő (I/O manager) gondoskodik.

Az I/O kezelő a kérésket nem érkezi sorrendben, hanem jól meghatározott prioritási sorrendnek megfelelően dolgozza fel, azaz továbbítja azokat a kernel módú eszközmeghajtók felé. A rendszer működőképességének fenntartása szempontjából fontosabb feladatokat a sorban előre véve, míg a kevésbé fontosakat késleltetve biztosítja, hogy a rendszer minden körülmények megtartsa általános reszponzivitását, és hogy egyetlen alkalmazás se tudja túlterheléssel a rendszer működését akadályozni.

Amikor az egyik processz futása közben programhiba lép fel, akkor az nem "ránthatja magával" a teljes rendszert, hiszen a hiba csakis az adott processzhez tartozó kliens modult érintheti. A szerver rész védett területen (a kernelben) helyezkedik el, és - ha jól van megírva - minden kapott paramétert gondosan ellenőriz, mielőtt feldolgozásnak vetné alá. Tökéletes kernel módú meghajtókból épített rendszert gyakorlatilag nem képesek az alkalmazások - legyenek azok bármilyen "gonoszak" is - felborítani, ami végső soron rendkívül megbízható és stabil operációs rendszert eredményez.
 

A Windows 95 hajtóprogramjai
Mint arról már a sorozat egy korábbi részében szó volt: a Windows 95 családba tartozó win32 platformok magját az ún. Virtual Machine Manager (VMM) nevű mikrokernel képezi, amit a hardver és eszközmeghajtók (valamint az ezekhez kapcsolódó kliens modulok) sokasága egészíti ki azzá, amit mi Windows operációs rendszer néven ismerünk.

A Windows 95 architektúrában az eszközök kezelését a kernel módú driverek helyett rendkívül speciális programok, az ún. virtuális eszközmeghajtók (virtual device drivers) látják el. (Figyelem! Az azonos terminológia ellenére ezek a virtuális eszközmeghajtók nem ekvivalensek a korábban a virtualizált eszközkezelés kapcsán említett meghajtóprogramokkal!) Ugyanakkor a Windows95 architektúra nem feltétlenül követeli meg a hardver meghajtóprogramok alkalmazását, hanem lehetővé teszi az alkalmazások számára, hogy azok közvetlenül vezéreljék a hardver egységeket. Ennek ellenére természetesen azonban ezen operációs rendszerek alá is léteznek hardvermeghajtó programok, bár ezek jelentősége elsődlegesen a már korábban említett absztrakciós interfészekhez történő illesztésben rejlik (pl. video- és hangkártya, lemezes eszköz meghajtók, stb.).

A Windows 95 családba tartozó operációs rendszerek is támogatják az NT architektúra eszköz I/O vezérlés modelljét, és intenzíven alkalmazzák a különböző rendszerkomponensekben a kliens-szerver architektúrát. Ugyanakkor a Windows 95 rendszerek I/O menedzsere nem rendel prioritásokat a különböző ki- és beviteli műveletekhez, ami növekvő válaszidőket eredményez, sőt, egy-egy hibásan működő vagy rosszindulatú program az egész rendszer stabilitását komolyan veszélyeztetheti az I/O rendszer túlterhelésével.
 

A WDM meghajtók
A Windows 98 megjelenése egy új fogalmat vezetett be az eszközkezelés terén is: a Win32 meghajtómodellt (Win32 Driver Model). A szóban forgó WDM valójában egy rétegezett meghajtó-architektúrát definiál, ami lehetővé teszi a Windows 98 és az azt követő VMM és NT alapú operációs rendszerek számára, hogy ugyanazokat a eszközmeghajtó programokat használhassák.

A WDM egy olyan egységes interfészt definiál a meghajtóprogramok számára, amelyeken keresztül azok a mindenkori konkrét gazdaplatform architektúrájától függetlenül képesek szervesen beépülni annak I/O rendszerébe, és szolgáltatásaikat, illetve a meghajtott eszközt az operációs rendszer, az alkalmazások, vagy más eszközmeghajtók rendelkezésére bocsátani. Az új architektúrában az eddigi meghajtóprogramok legnagyobb részét képező, platform-specifikus modulok immáron az operációs rendszer részét képezik, amelyeket az eszközmeghajtó programok az egységesített felületen keresztül vehetnek igénybe. Ez nem csak a meghajtóprogramok platformok közti cseréjét teszi lehetővé, de nagyban egyszerűsíti azok megírását és tesztelését is.

(folytatjuk)