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 DMA-ellenőrzés figyeli a közvetlen memória-hozzáférés (DMA) használatát. Mivel a DMA-rutinok a Windows fejlődésével megváltoztak, sok illesztőprogram helytelenül használja a DMA-hívásokat. Ezenkívül egyes illesztőprogram-írók megpróbálják teljesen megkerülni a HAL DMA alrendszert. Ez a gyakorlat alattomos hibákat vezethet be az illesztőprogramba.
Az Illesztőprogram-ellenőrző DMA-ellenőrzési lehetősége megpróbálja elkapni a gyakori DMA-hibákat. A !dma kernel hibakereső bővítményével együtt annak ellenőrzésére is használható, hogy egy illesztőprogram megfelelően használja-e a DMA-t.
Ezt az illesztőprogram-ellenőrző beállítást HAL-ellenőrzésnek is nevezik. A Driver Verifier által létrehozott egyes hibaüzenetek ezt a kifejezést használhatják.
A DMA különböző típusai
A DMA egy olyan mechanizmus, amellyel a hardvereszközök a processzor használata nélkül továbbíthatnak adatokat a memóriába vagy a memóriából. Az átvitel beállításához a processzorra van szükség, és az eszköz az átvitel befejezésekor jelzi a processzornak. Ennek a rendszernek az az előnye, hogy a processzor más feladatokat is el tud végezni a DMA-átvitel végrehajtása közben.
A Windows 2000 és újabb verziókban több DMA-típust is használnak:
Common-buffer DMA
A common-buffer DMA akkor történik, ha a rendszer egyetlen puffert tud lefoglalni, amelyet a hardver és a szoftver is elérhet. Az illesztőprogram feladata a pufferhez való hozzáférés szinkronizálása. A memória nincs gyorsítótárazva, így ez a szinkronizálás egyszerűbbé válik az illesztőprogram számára. A közös puffer beállítása után az illesztőprogram és a hardver is közvetlenül a puffer címére tud írni a HAL beavatkozása nélkül.
Csomag DMA
A csomag DMA akkor történik, ha egyetlen meglévő puffer van, amelyet le kell képezni a hardver általi használatra. A csomag DMA használatára példa egy fájl átvitele a memóriából egy lemezre. A common-buffer DMA használata ebben a helyzetben pazarló lenne, mert a fájlt át kell vinni a közös pufferbe, mielőtt a hardver átvihetné azt a lemezre. Ehelyett a HAL-hoz kell fordulni; ez megadja a drivernek a szükséges információkat, hogy segítsen a hardvernek megtalálni a tényleges puffert a memóriában. Ezt a műveletet bonyolítja, hogy az érintett rutinoknak különböző architektúrákban kell dolgozniuk.
Szórt/gyűjtött DMA
A scatter/gather DMA egy olyan módszer, amely lehetővé teszi, hogy egyszerre több csomag DMA-átvitelt állítsunk be. Ha például egy csomagot továbbít a hálózaton keresztül, a protokollverem minden része hozzáadja a saját fejlécét (TCP, IP, Ethernet stb.). Ezek a fejlécek a memória különböző pontjairól kerülnek lefoglalásra. Ebben az esetben a scatter/gather DMA időt takarít meg azáltal, hogy egy csoportos kérelmet nyújt be a HAL-nak, hogy minden fejlécet és az adatszegmenst a hardver elérhesse. Ahelyett, hogy a csomag minden részén meg kellene hívnia a csomag DMA-rutinjait, ez a módszer egyszer hívja meg az egyes rutinokat, és lehetővé teszi, hogy a HAL legyen felelős az egyes elemek egyenkénti leképezéséért.
Megjegyzés:A pont/gyűjtési képesség nem jelenti azt, hogy az eszköz használhatja a pont/gyűjtési rutinokat. A scatter/gather képesség az eszköz leírásában szereplő jelzőre utal, amely azt jelzi, hogy az eszköz képes olvasni vagy írni a memória bármely területéről, nem csupán egy meghatározott tartományból.
Rendszer DMA
A rendszer DMA-jának végrehajtása a rendszer DMA-vezérlőjének az alaplapon történő programozásával történik, hogy közvetlenül elvégezhesse az átvitelt. Csak ISA-kártyák használhatják a rendszer DMA-ját.
A DMA-ellenőrzés hatásai
Ha a DMA-ellenőrzés aktív, az illesztőprogram-ellenőrző észleli a DMA-rutinokkal való visszaélést, beleértve a következőket:
A DMA memóriapuffer túlfuttatása vagy aláfuttatása (ezeket a hibákat a hardver vagy az illesztőprogram okozhatja).
Közös puffer, adaptercsatorna, térképregisztráló vagy pont/gyűjtési lista dupla felszabadítása.
Memóriaszivárgás a gyakori pufferek, adaptercsatornák, térképregiszterek, szóró/gyűjtő listák vagy adapterek felszabadítása nélkül.
Egy adapterhez egyszerre több adaptercsatorna van jelen.
Már felszabadított és már nem létező adaptert próbál használni.
Nem történik az adapter puffer kiürítése.
Túl sok nyitott hivatkozásszám van egy adapterhez.
DMA végrehajtása lapozható pufferen (minden puffert zárolni kell a DMA-átvitel megkezdése előtt).
DMA végrehajtása egy MDL-n, csonkolt jelzőkkel.
Érvénytelen rendszercímre hivatkozik, akár az első MDL előtt, akár az első MDL vége után, akár az MDL-puffernél hosszabb átviteli hossz használatával, és átlépi az oldalhatárt az MDL-ben.
Egyszerre túl sok térképregisztrálót kell lefoglalni, vagy több térképregisztrátort kell kiosztani, mint az engedélyezett maximális szám.
Térképregisztrálások kettős leképezése.
Kísérlet a leképezési regiszterek felszabadítására, miközben néhány még mindig le van képezve.
Olyan térképregisztert próbál kiüríteni, amelyet nem képeztek le.
A térképregisztráló fájl végén túl sok bájt kiürítésével próbálkozik.
Nem megfelelő IRQL-en történő DMA-rutinok meghívása.
Null értékű DMA_ADAPTER átadása HAL rutinnak.
Cím és MDL átadása HAL rutinnak, ha a cím nem szerepel az MDL-ben.
Egy már leképezett címtartomány leképezésének kísérlete.
Megkíséreljük egy nem leképezett puffer kiürítését.
Kísérlet egy nulla hosszúságú puffer leképezésére az átvitelhez.
Az elavult HalGetAdapter függvény meghívása (az összes illesztőprogramnak inkább az IoGetDmaAdaptert kell használnia).
Az Illesztőprogram-ellenőrző figyeli az illesztőprogram viselkedését, és kiadja a 0xE6 hibaellenőrzést, ha bármelyik szabálysértés bekövetkezik. A hibakeresési paraméterek listáját lásd a Bug Check 0xE6 (DRIVER_VERIFIER_DMA_VIOLATION) című részben.
Mikor hasznos a DMA-ellenőrzés?
A DMA-t közvetlenül használó összes illesztőprogramot (a HAL DMA rutinok meghívásával) DMA-ellenőrzéssel kell tesztelni.
Emellett a miniportillesztőket is tesztelni kell, mivel gyakran közvetetten használják a DMA-t (a DMA-t használó portillesztők meghívásával).
A DMA-ellenőrzés hatékony módszer lehet a memória sérülésének észlelésére is, mivel észlelheti, ha egy illesztőprogram vagy egy hardvereszköz túlfut egy DMA-pufferen.
DMA-ellenőrzés figyelése
A kernel hibakereső bővítménye ( !dma ) számos DMA-információ megjelenítésére használható. Különböző részleteket jeleníthet meg az egyes DMA-adapterek viselkedéséről. A !dma bővítményre részletes példa, valamint a hibakereső bővítményekkel kapcsolatos általános információk találhatók a Windows hibakeresési eszközei csomag dokumentációjában. A részleteket a Windows hibakeresése című témakörben találja.
A beállítás aktiválása
Egy vagy több illesztőprogram DMA-ellenőrzési funkcióját az Illesztőprogram-ellenőrzőkezelő vagy a Verifier.exe parancssor használatával aktiválhatja. További részletekért lásd: Illesztőprogram-ellenőrző beállításainak kiválasztása.
A parancssorban
A parancssorban a DMA-ellenőrzés lehetőséget a 7. bit (0x80) jelöli. A DMA-ellenőrzés aktiválásához használjon egy 0x80 jelzőértéket, vagy adjon hozzá 0x80 a jelzőértékhez. Például:
verifier /flags 0x80 /driver MyDriver.sysA funkció a következő rendszerindítás után aktív lesz.
A Windows Vista és a Windows újabb verzióiban is aktiválhatja és inaktiválhatja a DMA-ellenőrzést a számítógép újraindítása nélkül, ha hozzáadja a /volatile paramétert a parancshoz. Például:
verifier /volatile /flags 0x80 /adddriver MyDriver.sysEz a beállítás azonnal érvénybe lép, de a számítógép leállítása vagy újraindításakor elveszik. További részletekért lásd Illékony beállítások használata.
A DMA-ellenőrzés funkció a szokásos beállításokban is megtalálható. Például:
verifier /standard /driver MyDriver.sysDriver Verifier Manager használata
- Indítsa el a Meghajtó Ellenőrző Kezelőt. Írja be Verifier parancssori ablakba.
- Válassza Egyéni beállítások létrehozása (kódfejlesztőknek) lehetőséget, majd kattintson a Továbbgombra.
- Válassza Egyéni beállítások kiválasztása a teljes listából.
- Válassza ki (ellenőrizze) a DMA-ellenőrzést.
A DMA-ellenőrzés funkció a szokásos beállításokban is megtalálható. A funkció használatához a Driver Verifier Managerben kattintson a Standard beállítások létrehozásaelemre.