DMA-ellenőrzés

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.sys
    

    A 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.sys
    

    Ez 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.sys
    
  • Driver Verifier Manager használata

    1. Indítsa el a Meghajtó Ellenőrző Kezelőt. Írja be Verifier parancssori ablakba.
    2. Válassza Egyéni beállítások létrehozása (kódfejlesztőknek) lehetőséget, majd kattintson a Továbbgombra.
    3. Válassza Egyéni beállítások kiválasztása a teljes listából.
    4. 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.