Sdílet prostřednictvím


Ověření DMA

Ověření DMA monitoruje použití přímého přístupu do paměti (DMA). Vzhledem k tomu, že se rutiny DMA změnily při vývoji Systému Windows, mnoho ovladačů používá nesprávné použití volání DMA. Někteří zapisovači ovladačů se navíc pokusí obejít subsystém HAL DMA úplně. Tento postup může do ovladače přinést záludné chyby.

Možnost Ověření DMA u ověřovatele ovladače se pokusí zachytit běžné chyby DMA. Spolu s rozšířením ladicího programu jádra !dma se dá ověřit, že ovladač správně používá DMA.

Tato možnost ověření ovladače se označuje také jako ověřování HAL. Tento termín mohou používat některé chybové zprávy vytvořené nástrojem Driver Verifier.

Různé typy DMA

DMA je mechanismus, pomocí kterého může hardwarové zařízení přenášet data do paměti nebo z paměti bez použití procesoru. Procesor je nutný k nastavení přenosu a zařízení bude signalizovat procesor po dokončení přenosu. Výhodou tohoto systému je, že procesor může provádět jiné úlohy při provádění přenosu DMA.

Ve Windows 2000 a novějších verzích se používá několik typů DMA:

DMA s běžným vyrovnávacím bufferem
DMA s využitím sdílené vyrovnávací paměti se provádí, když systém může přidělit jedinou vyrovnávací paměť, která je přístupná jak hardwaru, tak softwaru. Ovladač zodpovídá za synchronizaci přístupů k vyrovnávací paměti. Paměť není uložená v mezipaměti, což usnadňuje tuto synchronizaci ovladače. Po nastavení společné vyrovnávací paměti může ovladač i hardware zapisovat přímo na adresy ve vyrovnávací paměti bez zásahu HALu.

Packet DMA
Přenos DMA paketů se provádí v případě, že je k dispozici jedna existující vyrovnávací paměť, která musí být namapována pro použití hardwarem. Příkladem použití DMA paketu je přenos souboru z paměti na disk. Použití DMA společné vyrovnávací paměti v této situaci by bylo plýtvání, protože soubor by musel být přenesen do společné vyrovnávací paměti předtím, než by hardware mohl přenést na disk. Místo toho se konzultuje s HAL; poskytuje ovladači potřebné informace k tomu, aby hardwaru pomohl najít skutečnou vyrovnávací paměť v operační paměti. Potřeba propojovat postupy mezi různými architekturami tuto operaci komplikuje.

Rozdělený/sdružený DMA
Rozdělený/sbíraný DMA je zkratková metoda, která nastaví několik přenosů DMA datových paketů najednou. Pokud přenášíte paket přes síť, například každá část síťového zásobníku přidá vlastní hlavičku (TCP, IP, Ethernet atd.). Tato záhlaví jsou přidělována z různých míst v paměti. V tomto případě scatter/gather DMA šetří čas vydáním dávkového požadavku na HAL, aby mapovala každou hlavičku a datový segment pro přístup k hardwaru. Místo toho, abyste museli volat rutiní DMA balíčků pro každou část balíčku, tato metoda zavolá každou rutinu jednou a nechá HAL zodpovědný za mapování každé části jednotlivě.

Poznámka:Funkce rozdělování/sběr neznamená, že zařízení může používat rutiny rozdělování/sběru. Příznak scatter/gather označuje schopnost zařízení číst nebo zapisovat z jakékoli oblasti v paměti, místo aby bylo omezeno pouze na určitý rozsah.

Systémový DMA
Systém DMA se provádí programováním systémového řadiče DMA na základní desce, aby se přenos provedl přímo. Systémové DMA můžou používat jenom karty ISA.

Účinky ověřování DMA

Pokud je ověření DMA aktivní, ovladač verifier zjistí zneužití rutin DMA, včetně:

  • Přeplnění nebo podtečení vyrovnávací paměti DMA (tyto chyby mohou být způsobeny hardwarem nebo ovladačem).

  • Dvojité uvolnění společné vyrovnávací paměti, kanálu adaptéru, registra mapování nebo seznamu rozptýleného/seskupeného přístupu.

  • Únik paměti způsobený neuvolněním běžných vyrovnávacích pamětí, kanálů adaptérů, mapových registrů, scatter/gather seznamů nebo adaptérů.

  • Mít více než jeden kanál adaptéru k dispozici pro adaptér současně.

  • Pokus o použití adaptéru, který již byl uvolněn a již neexistuje.

  • Vyrovnávací paměť adaptéru nebyla vyprázdněna.

  • Příliš mnoho nevyřízených referenčních počtů pro adaptér

  • Provádění DMA na stránkovatelné vyrovnávací paměti (všechny vyrovnávací paměti by měly být uzamčeny před zahájením přenosu DMA).

  • Provádění DMA s MDL s poškozenými příznaky.

  • Odkazování na neplatnou systémovou adresu, buď před prvním MDL, po konci prvního MDL, nebo při použití délky přenosu, která je delší než vyrovnávací paměť MDL a překračuje hranici stránky v rámci MDL.

  • Přidělení příliš velkého počtu registrů mapy najednou nebo přidělení více registrů mapy, než je povolené maximální číslo.

  • Dvojité mapování registrů map

  • Pokus o uvolnění mapovaných registrů, zatímco některé jsou stále mapovány.

  • Pokus o vyprázdnění registru mapy, který nebyl mapován.

  • Pokoušíte se vyprázdnit příliš mnoho bajtů na konci souboru registru mapování.

  • Vyvolání rutin DMA v nesprávném prostředí IRQL

  • Předání nulové hodnoty DMA_ADAPTER rutině HAL.

  • Předání adresy a MDL rutině HAL, pokud adresa není obsažena v MDL.

  • Pokoušíte se namapovat rozsah adres, který už byl namapován.

  • Pokus o vyprázdnění vyrovnávací paměti, která není namapovaná.

  • Pokus o mapování vyrovnávací paměti nulové délky pro přenos.

  • Volání zastaralé funkce HalGetAdapter (všechny ovladače musí namísto toho používat IoGetDmaAdapter).

Nástroj Driver Verifier monitoruje chování ovladače a vyvolá kontrolu chyb 0xE6, pokud dojde k některému z těchto porušení. Viz Kontrola chyb 0xE6 (DRIVER_VERIFIER_DMA_VIOLATION) pro seznam parametrů kontroly chyb.

Kdy je ověření DMA užitečné?

Všechny ovladače, které používají přímý přístup do paměti DMA (voláním rutin HAL DMA), by měly být testovány s ověřením DMA.

Kromě toho by se měly testovat i ovladače miniportu, protože často používají DMA nepřímo (voláním ovladačů portů, které používají DMA).

Ověření DMA může být také efektivní způsob detekce poškození paměti, protože může zjistit, kdy ovladač nebo hardwarové zařízení překročí vyrovnávací paměť DMA.

Monitorování ověřování DMA

Rozšíření ladicího programu jádra !dma lze použít k zobrazení velkého množství informací DMA. Může zobrazit různé podrobnosti o chování jednotlivých adaptérů DMA. Existuje podrobný příklad rozšíření !dma a také obecné informace o rozšíření ladicího programu v dokumentaci v balíčku Nástroje ladění pro Windows. Podrobnosti najdete v tématu Ladění systému Windows .

Aktivace této možnosti

Funkci ověření DMA můžete aktivovat pro jeden nebo více ovladačů pomocí Správce ověření ovladačů nebo příkazového řádku Verifier.exe. Podrobnosti najdete v tématu Výběr možností ověření ovladače.

  • Na příkazovém řádku

    Na příkazovém řádku je možnost Ověření DMA reprezentována bitem 7 (0x80). K aktivaci ověřování DMA použijte hodnotu příznaku 0x80 nebo přidejte 0x80 k hodnotě příznaku. Například:

    verifier /flags 0x80 /driver MyDriver.sys
    

    Funkce bude aktivní po dalším spuštění.

    V systému Windows Vista a novějších verzích systému Windows můžete také aktivovat a deaktivovat ověřování DMA bez restartování počítače přidáním parametru /volatile do příkazu. Například:

    verifier /volatile /flags 0x80 /adddriver MyDriver.sys
    

    Toto nastavení je efektivní okamžitě, ale při vypnutí nebo restartování počítače dojde ke ztrátě. Podrobnosti najdete v tématu Použití volatile nastavení.

    Funkce ověření DMA je také součástí standardního nastavení. Například:

    verifier /standard /driver MyDriver.sys
    
  • Použití Správce ověřovatele ovladačů

    1. Spusťte Správce ověřovatele ovladačů. Do okna příkazového řádku zadejte ověřitel .
    2. Vyberte Vytvořit vlastní nastavení (pro vývojáře kódu) a potom klikněte na Další.
    3. Vyberte jednotlivá nastavení z úplného seznamu.
    4. Vyberte (zaškrtněte) ověření DMA.

    Funkce ověření DMA je také součástí standardního nastavení. Chcete-li použít tuto funkci, klikněte ve Správci ověření ovladače na tlačítko Vytvořit standardní nastavení.