Sdílet prostřednictvím


Detekce poškození speciální paměťové oblasti v nástroji Driver Verifier

Poškození paměti je běžný problém s ovladačem. Chyby ovladače můžou způsobit pády dlouho po provedení chyb. Nejběžnější z těchto chyb je přístup k paměti, která již byla uvolněna, a přidělení n bajtů a poté přístup k n+1 bajtům.

Pokud chcete zjistit poškození paměti, může Driver Verifier přidělit paměť ovladače ze speciálního paměťového poolu a monitorovat tento pool pro nesprávné přístupy. Speciální poolová podpora je poskytována pro systémem dodávané rutiny v režimu jádra, jako například ExAllocatePoolWithTag, a také pro rutiny systému GDI, jako je EngAllocMem.

Zvláštní fond podle zarovnání

K dispozici jsou dvě zarovnání speciálního fondu:

  • Ověření zarovnání Start je lepší při detekci podtečení přístupu.
  • Ověření koncového zarovnání je lepší při zjišťování přetečení přístupu.

Další informace o použití možností Ověřit začátek a ověřit konec naleznete v tématu Detekce přetečení a podtečení. Všimněte si, že velká většina poškození paměti je způsobená přetečením, nikoli podtečením.

Pokud je funkce Speciální fondy aktivní a je vybrána možnost Ověřit konec, je každé přidělení paměti požadované ovladačem umístěno na samostatné stránce. Vrátí se nejvyšší možná adresa, která umožňuje umístit přidělení na stránku, aby byla paměť zarovnaná s koncem stránky. Předchozí část stránky je napsána se speciálními vzory. Předchozí stránka a další stránka jsou označené jako nepřístupné.

Pokud se ovladač pokusí získat přístup k paměti po ukončení přidělení, ovladač Verifier toto okamžitě zjistí a vydá kontrolu chyb 0xCD. Pokud ovladač zapíše do paměti před začátkem vyrovnávací paměti, změní se vzory (pravděpodobně). Když se vyrovnávací paměť uvolní, Driver Verifier zjistí změnu a způsobí zastavení s chybou 0xC1.

Pokud ovladač po uvolnění paměti přečte nebo zapíše do vyrovnávací paměti, nástroj Driver Verifier vydá kontrolu chyb 0xCC.

Při výběru příkazu Ověřit spuštění je vyrovnávací paměť zarovnaná se začátkem stránky. Při tomto nastavení způsobí podtečení okamžitou chybovou kontrolu a přetečení způsobí chybovou kontrolu při uvolnění paměti. Tato možnost je jinak shodná s možností Ověřit konec .

Ověřit konec je výchozí zarovnání, protože chyby přetečení jsou v ovladačích mnohem častější než chyby podtečení.

Přidělení individuální paměti může přepsat tato nastavení a zvolit své zarovnání zavoláním ExAllocatePoolWithTagPriority s parametrem Priority nastaveným na hodnotu XxxSpecialPoolOverrun nebo XxxSpecialPoolUnderrun. (Tato rutina nemůže aktivovat nebo deaktivovat funkci speciálního fondu ani požádat o speciální fond pro přidělení paměti, který by jinak byl přidělen z normálního fondu. Pouze zarovnání lze řídit z této rutiny.)

Ve Windows 7 a novějších verzích operačního systému Windows podporuje možnost Speciální fond paměť přidělenou pomocí následujících rozhraní API jádra:

Zvláštní fond podle značky fondu nebo velikosti přidělení

Kromě funkce speciálního fondu nástroje Driver Verifier, který požaduje zvláštní fond pro přidělení zadaným ovladačem, existují dva další způsoby použití speciálního fondu:

  • Značka fondu. Vyžádejte si speciální fond pro všechna přidělení se zadanou značkou fondu.

  • Velikost. Vyžádat si speciální fond pro všechny alokace v určeném rozsahu velikostí.

Pokud chcete požádat o speciální pool pro tag fondu nebo rozsah velikostí, použijte Gflags, nástroj, který je součástí nástrojů ladění pro Windows. Podrobnosti viz Použití nástroje Globální vlajky.

Můžete použít funkce speciálního fondu nástroje Driver Verifier a funkce speciálního fondu nástroje Gflags současně. Pokud ano, mějte na paměti, že speciální fond je omezený, že ne všechny pokusy o přidělení ze speciálního fondu proběhnou úspěšně a systém Windows vrátí stav úspěchu pro neúspěšné pokusy o přidělení ze speciálního fondu, které jsou splněny přidělením z běžných fondů paměti.

Zvláštní účinnost poolu

Ne všechny zvláštní žádosti o fond jsou splněny. Každé přidělení ze speciálního fondu používá jednu stránku nestránkové fyzické paměti a dvě stránky virtuálního adresního prostoru. Pokud je fond vyčerpán, paměť je přidělena standardním způsobem, dokud se speciální fond znovu zpřístupní. Při vyplnění speciálního požadavku na fond ze standardního fondu funkce žádosti nevrátí chybu, protože žádost o fond byla úspěšná. Proto nedoporučujeme ověřovat více ovladačů současně, pokud je aktivována funkce Speciální fond.

Jeden ovladač, který vytváří mnoho malých požadavků na paměť, může také tento fond vyčerpat. Pokud k tomu dojde, může být vhodnější přiřadit značky fondu k přidělení paměti ovladače a vyhradit speciální pool pro jednu značku fondu současně.

Velikost speciálního fondu se zvyšuje s množstvím fyzické paměti v systému; v ideálním případě by to mělo být alespoň 1 Gigabajt (GB). Na počítačích x86, protože virtuální (kromě fyzického) prostoru je spotřebováno, nepoužívejte možnost spouštění /3 GB . Je také vhodné zvýšit minimální/maximální velikost stránkovacího souboru o faktor dvou nebo tří.

Abyste měli jistotu, že se testují všechna přidělení řidiče, doporučuje se stresovat řidiče po dlouhou dobu.

Monitorování speciálního fondu

Statistiky týkající se přidělování fondů je možné monitorovat. Tyto lze zobrazit pomocí Správce Driver Verifier, příkazového řádku Verifier.exe nebo v souboru protokolu. Podrobnosti najdete v tématu Monitorování globálních čítačů .

Pokud je čítač Úspěšné přidělení ve speciálním fondu roven čítači Úspěšné přidělení fondu, pak speciální fond byl dostatečný k pokrytí všech paměťových přidělení. Pokud je první čítač nižší než druhý čítač, byl speciální fond alespoň jednou vyčerpán.

Tyto čítače nesledují přidělení, jejichž velikost odpovídá jedné stránce nebo je větší, protože speciální zásobník pro ně není použitelný.

Pokud je povolena funkce Speciální Fond, ale méně než 95% všech přidělení fondů bylo přiřazeno ze Speciálního Fondu, zobrazí se upozornění ve Správci Ověření Ovladače. V systému Windows 2000 se toto upozornění zobrazí na obrazovce Stav ovladače . V systému Windows XP a novějších se toto upozornění zobrazí na obrazovce Globální čítače . Pokud k tomu dojde, měli byste ověřit zkrácený seznam ovladačů, ověřit jednotlivé fondy podle značky fondu nebo do systému přidat další fyzickou paměť.

Rozšíření ladicího programu jádra !verifier lze použít také k monitorování speciálního použití fondu. Zobrazuje podobné informace jako driver Verifier Manager. Informace o rozšířeních pro ladění naleznete v tématu Ladění systému Windows.

Aktivace možnosti speciálního fondu

Funkci Speciální fond 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.

Poznámka:

Chcete-li aktivovat funkci Speciální zásobník podle značky zásobníku nebo velikosti alokace, nebo nastavit zarovnání Ověřit spuštění (zjistit podtečení) a Ověřit konec (zjistit přetečení), použijte nástroj Globální příznaky; tato nastavení zarovnání platí pro všechna zvláštní alokace zásobníků.

  • Na příkazovém řádku

    Na příkazovém řádku je možnost Speciální fond reprezentována bitem 0 (0x1). Chcete-li aktivovat Special Pool, použijte hodnotu příznaku 0x1 nebo přidejte 0x1 k hodnotě příznaku. Například:

    verifier /flags 0x1 /driver MyDriver.sys
    

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

    Vy můžete také aktivovat a deaktivovat Special Pool bez restartování počítače přidáním parametru /volatile do příkazu. Například:

    verifier /volatile /flags 0x1 /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 Speciální pool je taktéž v rámci standardního nastavení. Například:

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

    1. Vyberte Vytvořit vlastní nastavení (pro vývojáře kódu) a potom klikněte na Další.
    2. Vyberte jednotlivá nastavení z úplného seznamu.
    3. Vyberte (zaškrtněte) Zvláštní fond.

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