Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A kernelmódú illesztőprogramok lefuttatásos védelemmel biztonságosan hozzáférhetnek a megosztott rendszermemória olyan objektumaihoz, amelyeket egy másik kernelmódú illesztőprogram hoz létre és töröl.
A rendszer azt állítja, hogy az objektum le lesz futva , ha az objektum összes függőben lévő hozzáférése befejeződött, és az objektum elérésére vonatkozó új kérések nem lesznek megadva. Előfordulhat például, hogy egy megosztott objektumot le kell futtatni, hogy törölhető legyen, és új objektummal helyettesíthető legyen.
A megosztott objektumot birtokló illesztőprogram engedélyezheti, hogy más illesztőprogramok megszerezhessék és elengedhessék az objektum lefutási védelmét. Ha a lefuttatás elleni védelem érvényben van, a tulajdonostól eltérő illesztőprogram anélkül érheti el az objektumot, hogy a tulajdonos a hozzáférés befejeződése előtt törli az objektumot. A hozzáférés megkezdése előtt a hozzáférést kérő illesztőprogram lefuttatásos védelmet kér az objektumon. Egy hosszú élettartamú objektum esetében ez a kérés szinte mindig meg van adva. A hozzáférés befejezése után a hozzáférési illesztőprogram felszabadítja a korábban beszerzett lefutási védelmet az objektumon.
Elsődleges lefutás elleni védelmi rutinok
Az objektum megosztásának megkezdéséhez az objektumot birtokló illesztőprogram meghívja az ExInitializeRundownProtection rutint , hogy inicializálja az objektum lefutás elleni védelmét. A hívás után az objektumhoz hozzáférő más illesztőprogramok lefutási védelmet szerezhetnek be és oldhatnak fel az objektumon.
A megosztott objektumhoz hozzáférő illesztőprogram meghívja az ExAcquireRundownProtection rutint, hogy lefutásos védelmet kérjen az objektumon. A hozzáférés befejezése után az illesztőprogram meghívja az ExReleaseRundownProtection rutint az objektum lefutás elleni védelmének kiadásához.
Ha a tulajdonos illesztőprogramja megállapítja, hogy a megosztott objektumot törölni kell, az illesztőprogram megvárja az objektum törlését, amíg az objektum összes kiugró hozzáférése befejeződik.
A megosztott objektum törlésének előkészítése során a tulajdonos illesztőprogram meghívja az ExWaitForRundownProtectionRelease rutint, hogy várja meg az objektum lefutását. A hívás során az ExWaitForRundownProtectionRelease megvárja az objektumon korábban megadott lefutás elleni védelem összes példányának elengedéséig, ugyanakkor megakadályozza, hogy új kérések juthassanak az objektum lefutás elleni védelmére. Az utolsó védett hozzáférés befejeződése után és a futásbeli védelem összes példányának kiadása után az ExWaitForRundownProtectionRelease visszatér, és a tulajdonos illesztőprogram biztonságosan törölheti az objektumot.
Az ExWaitForRundownProtectionRelease addig blokkolja a hívó illesztőprogram-szál végrehajtását, amíg a megosztott objektumon lefutás elleni védelmet biztosító összes illesztőprogram fel nem oldja ezt a védelmet. Annak érdekében, hogy az ExWaitForRundownProtectionRelease ne blokkolja túlzottan hosszú ideig a végrehajtást, a megosztott objektumhoz hozzáférő illesztőszálaknak kerülniük kell a felfüggesztést, miközben lefuttatásos védelmet tartanak az objektum felett. Az illesztőprogramokhoz való hozzáférés érdekében meg kell hívni az ExAcquireRundownProtection és az ExReleaseRundownProtection parancsot egy kritikus régióban vagy védett régióban, vagy az IRQL APC_LEVEL szintjén.
A lemerülési védelem felhasználási módjai
A lefuttatás elleni védelem akkor hasznos, ha olyan megosztott objektumhoz biztosít hozzáférést, amely szinte mindig elérhető, de időnként törölni és cserélni kell őket. Az adatokhoz hozzáférő vagy az objektumban rutinokat hívó illesztőprogramok nem próbálják meg elérni az objektumot a törlés után. Ellenkező esetben ezek az érvénytelen hozzáférések kiszámíthatatlan viselkedést, adatsérülést vagy akár rendszerhibát is okozhatnak.
A víruskereső illesztőprogramok például általában a memóriában maradnak, amikor az operációs rendszer fut. Előfordulhat, hogy ezt az illesztőprogramot ki kell üríteni, és lecserélni kell az illesztőprogram frissített kiadására. Más illesztőprogramok I/O-kéréseket küldenek a víruskereső-illesztőprogramnak, hogy hozzáférjenek az illesztőprogram adataihoz és rutinjaihoz. Az I/O-kérés elküldése előtt a kernelösszetevők, például a fájlrendszerszűrő-kezelők lefuttatási védelmet szerezhetnek a víruskereső illesztőprogram idő előtti eltávolítása ellen, miközben az kezeli az I/O-kérést. Az I/O-kérés befejeződése után a leállásvédelem feloldható.
A lefuttatás elleni védelem nem szerializálja a megosztott objektumokhoz való hozzáférést. Ha egy objektumon egyszerre két vagy több hozzáférés-illesztő rendelkezik lefutási védelemmel, és az objektumhoz való hozzáférést szerializálni kell, a hozzáférések szerializálásához más mechanizmust, például a kölcsönös kizárási zárat kell használni.
Az EX_RUNDOWN_REF szerkezet
Egy EX_RUNDOWN_REF-struktúra nyomon követi a lefutás elleni védelem állapotát egy megosztott objektumon. Ez a struktúra átlátszatlan az illesztőprogramok számára. A rendszer által biztosított lefutásvédelmi rutinok ezt a struktúrát használják az objektumra jelenleg érvényben lévő lefuttatásos védelem példányainak megszámlálására. Ezek a rutinok ezt a struktúrát is használják annak nyomon követésére, hogy az objektum le van-e romolva vagy éppen romlás alatt áll.
Egy objektum megosztásának megkezdéséhez az objektumot birtokló illesztőprogram meghívja az ExInitializeRundownProtectiont az objektumhoz társított EX_RUNDOWN_REF szerkezet inicializálásához. Az inicializálás után a tulajdonos illesztőprogram elérhetővé teheti ezt a struktúrát az objektumhoz hozzáférést igénylő más illesztőprogramok számára. A hozzáférési illesztőprogramok paraméterként adják át ezt a struktúrát az ExAcquireRundownProtection és az ExReleaseRundownProtection hívásoknak, amelyek lefuttatásos védelmet szereznek be és bocsátanak ki az objektumon. A tulajdonos illesztőprogram paraméterként továbbítja ezt a struktúrát az ExWaitForRundownProtectionRelease hívásnak, amely megvárja, amíg az objektum lefut, hogy biztonságosan törölhető legyen.
Zárakkal való összehasonlítás
A lefuttatásos védelem a megosztott objektumok biztonságos elérésének egyik módja. Egy másik megközelítés a kölcsönös kizárást biztosító szoftverzárolás használata. Ha egy illesztőprogramnak hozzáférésre van szüksége egy másik illesztőprogram által jelenleg zárolt objektumhoz, az első illesztőprogramnak meg kell várnia, amíg a második illesztőprogram feloldja a zárolást. A zárolások beszerzése és felszabadítása azonban teljesítménybeli akadozást okozhat, és a zárolások sok memóriát használhatnak fel. Helytelen használat esetén a zárolások miatt az ugyanazon megosztott objektumokért versengeő illesztőprogramok holtpontra kerülhetnek. A holtpontok észlelésére és elkerülésére tett erőfeszítések általában jelentős számítási erőforrások eltérítését igénylik.
A zárolásokkal ellentétben a lefuttatás elleni védelem viszonylag egyszerű feldolgozási idővel és memóriaigényekkel rendelkezik. Az objektumhoz egy egyszerű hivatkozásszám van társítva, amely biztosítja, hogy az objektum törlése elhalasztva legyen, amíg az objektum összes függőben lévő hozzáférése be nem fejeződik. Ezzel a megközelítéssel atomi, összekapcsolt hardverutasítások használhatók kölcsönös kizárási szoftverzárolások helyett, hogy biztonságos hozzáférést biztosítsanak egy objektumhoz. A leállás elleni védelem beszerzésére és elengedésére irányuló hívások általában gyorsak. A könnyűsúlyú mechanizmus, például a lefutás elleni védelem használatának előnyei jelentősek lehetnek a hosszú élettartamú és sok illesztőprogram között megosztott objektumok esetében.
Egyéb lemerülés elleni védelmi rutinok
A korábban említetteken kívül számos egyéb lefutásvédelmi rutin is elérhető. Ezeket az extra rutinokat egyes meghajtók használhatják.
Az ExReInitializeRundownProtection rutin lehetővé teszi, hogy egy korábban használt EX_RUNDOWN_REF struktúra új objektumhoz legyen társítva, és inicializálja az objektum lefutás elleni védelmét.
Az ExRundownCompleted rutin frissíti a EX_RUNDOWN_REF struktúrát, hogy jelezze, hogy a társított objektum lefutása befejeződött.
Az ExAcquireRundownProtectionEx és az ExReleaseRundownProtectionEx rutinok hasonlóak az ExAcquireRundownProtection és az ExReleaseRundownProtection rutinhoz. Ez a négy rutin növeli vagy lecsökkenti a megosztott objektumokra érvényes lefutásos védelem példányainak számát. Míg az ExAcquireRundownProtection és az ExReleaseRundownProtection ezt a számot egyenként növeli és decrementeli, addig az ExAcquireRundownProtectionEx és az ExReleaseRundownProtectionEx tetszőleges összegekkel növeli és decrementeli a darabszámot.
Gyorsítótár-vezérelt lefuttatás elleni védelem
A lefutási referencia egy kompakt és gyors adatstruktúra, de gyorsítótár-versengést okozhat, ha sok processzor egyszerre próbálja megszerezni a referenciát. Ez befolyásolhatja az illesztőprogram teljesítményét és méretezhetőségét.
A probléma elkerülése érdekében egy gyorsítótár-tudatos kifutási hivatkozással terjesztheti a referenciakövetést több gyorsítótársor között. Ez csökkenti a gyorsítótár-versengést, és javítja az illesztőprogram teljesítményét a többprocesszoros számítógépeken.
Gyorsítótár-vezérelt lefuttatási hivatkozás használatához kövesse az alábbi lépéseket:
- Hozzon létre egy EX_RUNDOWN_REF_CACHE_AWARE objektumot az alábbi műveletek egyikével:
- Hívja fel az ExAllocateCacheAwareRundownProtection parancsot. Ez gondoskodik az inicializálásról.
- Másik lehetőségként a memóriafoglalás szabályozásához hívja meg az ExSizeOfRundownProtectionCacheAware parancsot, foglaljon le egy visszaadott méretű puffert, majd adja át ezt a puffert és méretet az ExInitializeRundownProtectionCacheAware-nek.
- Az ExAcquireRundownProtectionCacheAware rutin meghívásával kérjen lefutás elleni védelmet az objektumon, mielőtt hozzá fér. Ez a rutin IGAZ értéket ad vissza, ha a kérés meg van adva, vagy HAMIS értéket, ha az objektum lefut.
- Az objektumhoz való hozzáférés után, az ExReleaseRundownProtectionCacheAware rutin meghívásával oldja fel a futtatás elleni védelmet.
- Várja meg, amíg az objektum lefut, mielőtt törli az ExWaitForRundownProtectionReleaseCacheAware rutin meghívásával. Ez a rutin blokkolja az aktuális szálat, amíg az objektumon a lefutás elleni védelem összes példánya ki nem szabadul.
- Ha a ExAllocateCacheAwareRundownProtection függvényt korábban meghívták, akkor az ExFreeCacheAwareRundownProtection meghívásával szabadítsa fel a lefutási referenciát.
Gyorsítótár-vezérelt lefuttatási hivatkozás újbóli használatához kövesse az alábbi lépéseket:
- Az ExWaitForRundownProtectionReleaseCacheAware hívása után hívja meg az ExRundownCompletedCacheAware parancsot, hogy jelezze, hogy a régi objektum lefutása befejeződött.
- Az ExReInitializeRundownProtectionCacheAware meghívásával újraincializálhatja a hivatkozást a társított objektum lefuttatása után.
- Most az illesztőprogram ismét meghívhatja az ExAcquireRundownProtectionCacheAware parancsot.
A gyorsítótár-alapú lefutási referenciák előnye, hogy adott helyzetekben jobb teljesítményt és méretezhetőséget biztosítanak, de több memóriát használnak fel, mint egy normál lefutási referenciát. Ezt a kompromisszumot érdemes figyelembe venni, amikor a rundown referenciák két típusa között választ.