Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
DMA-verifiering övervakar användningen av direkt minnesåtkomst (DMA). Eftersom DMA-rutinerna har ändrats i takt med att Windows har utvecklats använder många drivrutiner fel DMA-anrop. Dessutom försöker vissa drivrutinsförfattare kringgå HAL DMA-undersystemet helt och hållet. Den här metoden kan introducera lömska buggar i drivrutinen.
Alternativet DMA-verifiering för drivrutinsverifierare försöker fånga vanliga DMA-fel. Tillsammans med kerneldebuggerutvidgningen !dma kan den användas för att verifiera att en drivrutin använder DMA på rätt sätt.
Det här alternativet för drivrutinsverifierare kallas även HAL-verifiering. Vissa felmeddelanden som genereras av drivrutinsverifieraren kan använda den här termen.
Olika typer av DMA
DMA är en mekanism genom vilken en maskinvaruenhet kan överföra data till eller från minnet utan att använda processorn. Processorn måste konfigurera överföringen och enheten signalerar processorn när överföringen har slutförts. Fördelen med det här systemet är att processorn kan utföra andra uppgifter medan DMA-överföringen utförs.
Det finns flera typer av DMA som används i Windows 2000 och senare:
DMA med delad buffert
DMA med gemensam buffert utförs när systemet kan allokera en enda buffert som är tillgänglig för både maskinvaran och programvaran. Drivrutinen ansvarar för att synkronisera åtkomst till bufferten. Minnet cachelagras inte, vilket gör den här synkroniseringen enklare för drivrutinen. När du har konfigurerat en gemensam buffert kan både drivrutinen och maskinvaran skriva direkt till adresserna i bufferten utan några åtgärder från HAL.
Paket-DMA
Paket-DMA utförs när det finns en enda befintlig buffert som måste mappas för användning av maskinvaran. Ett exempel på hur du använder paket-DMA är överföringen av en fil från minnet till en disk. Att använda common-buffer DMA i den här situationen skulle vara slöseri, eftersom filen måste överföras till den gemensamma bufferten innan maskinvaran kan överföra den till disken. I stället konsulteras HAL; den ger drivrutinen den information den behöver för att hjälpa maskinvaran att hitta den faktiska bufferten i minnet. Den här åtgärden kompliceras av behovet av att de rutiner som ingår fungerar i olika arkitekturer.
Scatter/gather-DMA
Punkt-/insamlings-DMA är en genvägsmetod som konfigurerar flera paket-DMA-överföringar samtidigt. Om du till exempel överför ett paket via nätverket lägger varje del av nätverksstacken till sin egen rubrik (TCP, IP, Ethernet och så vidare). Alla dessa rubriker allokeras från olika platser i minnet. I det här fallet sparar scatter/gather-DMA tid genom att utfärda en batchbegäran till HAL för att mappa varje header och datasegmentet för tillgång av maskinvaran. I stället för att behöva anropa paket-DMA-rutinerna för varje del av paketet anropar den här metoden varje rutin en gång och låter HAL ansvara för att mappa var och en individuellt.
Obs!Spridning/samlingskapabilitet innebär inte att enheten kan använda spridning/samlingsrutinerna. Scatter/gather-funktionen refererar till en flagga i enhetsbeskrivningen som anger att enheten kan läsa eller skriva från valfri plats i minnet, i stället för bara ett visst intervall.
System DMA
System DMA utförs genom programmering av systemets DMA-styrenhet på moderkortet för att göra överföringen direkt. Endast ISA-kort kan använda system-DMA.
Effekter av DMA-verifiering
När DMA-verifiering är aktiv identifierar drivrutinsverifieraren missbruk av DMA-rutiner, inklusive:
Överskrider eller underskrider DMA-minnesbufferten ( dessa fel kan göras av maskinvaran eller drivrutinen ).
Dubbelfrigöring av en gemensam buffert, adapterkanal, kartregister eller sprida/samla-lista.
Läcka minne genom att inte frigöra vanliga buffertar, adapterkanaler, minneskartsregister, scatter/gather-listor eller adaptrar.
Det finns fler än en adapterkanal närvarande för en adapter samtidigt.
Försöker använda en adapter som redan har frigjorts och inte längre finns.
Tömmer inte en adapterbuffert.
Har för många utestående referenser med en adapter.
Utföra DMA på en allokerbar buffert (alla buffertar ska låsas innan DMA-överföringen börjar).
Utför DMA på en MDL med manglade flaggor.
Refererar till en ogiltig systemadress, antingen före den första MDL:en eller efter slutet av den första MDL:en, eller med en överföringslängd som är längre än MDL-bufferten och korsar en sidgräns inom MDL.
Allokera för många kartregister samtidigt eller allokera fler kartregister än det maximala antal som tillåts.
Dubbelmappning av kartregister.
Försöker frigöra kartregister medan vissa fortfarande är mappade.
Försöker tömma ett kartregister som inte har mappats.
Försöker tömma för många byte i slutet av mappningsregisterfilen.
Anropa DMA-rutiner vid en felaktig IRQL.
Skicka ett null-värde DMA_ADAPTER till en HAL-rutin.
Skicka en adress och en MDL till en HAL-rutin när adressen inte finns i MDL.
Försöker mappa ett adressintervall som redan har mappats.
Försöker rensa en buffert som inte är mappad.
Försöker mappa en buffert med noll längd för överföring.
Anropa den föråldrade funktionen HalGetAdapter (alla drivrutiner måste använda IoGetDmaAdapter i stället).
Drivrutinsverifieraren övervakar drivrutinens beteende och utfärdar felkontroll 0xE6 om någon av dessa överträdelser inträffar. Se Felkontroll 0xE6 (DRIVER_VERIFIER_DMA_VIOLATION) för en lista över parametrarna för felkontrollen.
När är DMA-verifiering användbart?
Alla drivrutiner som använder DMA direkt (genom att anropa HAL DMA-rutinerna) bör testas med DMA-verifiering.
Dessutom bör miniportdrivrutiner också testas, eftersom de ofta använder DMA indirekt (genom att anropa portdrivrutiner som använder DMA).
DMA-verifiering kan också vara ett effektivt sätt att identifiera minnesskada, eftersom det kan upptäckas när en drivrutin eller en maskinvaruenhet överskrider en DMA-buffert.
Övervaka DMA-verifiering
Kernel-felsökningstillägget !dma kan användas för att visa en mängd DMA-information. Den kan visa olika detaljer om beteendet för varje DMA-kort. Det finns ett detaljerat exempel på !dma-tillägget samt allmän information om tillägg för felsökningsprogram i dokumentationen i paketet Felsökningsverktyg för Windows. Mer information finns i Windows-felsökning .
aktivera det här alternativet
Du kan aktivera funktionen DMA-verifiering för en eller flera drivrutiner med hjälp av Driver Verifier Manager eller kommandoraden Verifier.exe. Mer information finns i Välja alternativ för drivrutinsverifierare.
På kommandoraden
På kommandoraden representeras alternativet DMA-verifiering av bit 7 (0x80). Om du vill aktivera DMA-verifiering använder du ett flaggvärde på 0x80 eller lägger till 0x80 i flaggvärdet. Till exempel:
verifier /flags 0x80 /driver MyDriver.sysFunktionen är aktiv efter nästa start.
I Windows Vista och senare versioner av Windows kan du också aktivera och inaktivera DMA-verifiering utan att starta om datorn genom att lägga till parametern /volatile i kommandot. Till exempel:
verifier /volatile /flags 0x80 /adddriver MyDriver.sysDen här inställningen gäller omedelbart, men går förlorad när du stänger av eller startar om datorn. Mer information finns i Använda flyktiga inställningar.
Funktionen DMA-verifiering ingår också i standardinställningarna. Till exempel:
verifier /standard /driver MyDriver.sysAnvända Drivrutinsverifieringshanteraren
- Starta hanteraren för drivrutinsverifierare. Skriv Verifier i ett kommandotolkfönster.
- Välj Skapa anpassade inställningar (för kodutvecklare) och klicka sedan på Nästa.
- Välj Välj enskilda inställningar i en fullständig lista.
- Välj (kontrollera) DMA-verifiering.
Funktionen DMA-verifiering ingår också i standardinställningarna. Om du vill använda den här funktionen klickar du på Skapa standardinställningar i Drivrutinsverifierarhanteraren.