Megosztás:


Speciális készletmemória-sérülés észlelése az Illesztőprogram-ellenőrzőben

A memóriakorrupció gyakori illesztőprogram-probléma. Az illesztőprogram hibák baleseteket okozhatnak hosszú idővel a hibák elkövetése után. Ezek közül a leggyakoribb hibák a már felszabadított memória elérése, az n bájtok kiosztása, majd az n+1 bájt elérése.

A memória sérülésének észleléséhez az Illesztőprogram-ellenőrző lefoglalhatja az illesztőprogram memóriáját egy speciális készletből, és figyelheti a készletet a helytelen hozzáférés érdekében. A rendszer által biztosított kernel módú rutinokhoz, például az ExAllocatePoolWithTaghez , valamint a GDI által biztosított rutinokhoz, például az EngAllocMemhez speciális készlettámogatást biztosítunk.

Speciális tárterület igazítások szerint

A speciális készlet két kiigazítása érhető el:

  • A Verify Start igazítás jobban érzékeli a hozzáférési alulcsordulásokat.
  • A Befejezés Ellenőrzése jobban észleli a hozzáférési túllépéseket.

A Start és a Záró ellenőrzés beállításainak használatáról további információt a Túlfuttatások és az Aláfutások észlelése című témakörben talál. Vegye figyelembe, hogy a memóriasérülések túlnyomó többsége túlfutások miatt következik be, nem pedig alulfutások miatt.

Ha a Speciális készlet funkció aktív, és a Befejezés ellenőrzése lehetőség ki van választva, az illesztőprogram által kért memóriafoglalások külön oldalra kerülnek. A lehető legmagasabb címet adja vissza, amely lehetővé teszi, hogy a foglalás elférjen az oldalon, így a memória igazodik az oldal végéhez. Az oldal előző része speciális mintákkal van megírva. Az előző és a következő lap elérhetetlenként van megjelölve.

Ha az illesztőprogram a foglalás befejezése után próbál hozzáférni a memóriához, az Illesztőprogram-ellenőrző azonnal észleli ezt, és Hibaellenőrzés 0xCD-et ad ki. Ha az illesztőprogram a puffer kezdete előtt ír a memóriába, ez (feltehetően) megváltoztatja a mintákat. A puffer felszabadításakor az Illesztőprogram-ellenőrző észleli a módosítást, és 0xC1 hibajelentést bocsát ki.

Ha az illesztőprogram a felszabadítása után olvas vagy ír a pufferbe, az Illesztőprogram-ellenőrző egy Hibaellenőrzés 0xCC-et ad ki.

Ha a Start ellenőrzése beállítás be van jelölve, a memóriapuffer a lap elejéhez igazodik. Ezzel a beállítással az aláfutások azonnali hibaellenőrzést okoznak, a túllépések pedig hibaellenőrzést okoznak a memória felszabadításakor. Ez a beállítás egyébként megegyezik a Befejezés ellenőrzése lehetőséggel.

Verify End az alapértelmezett igazítás, mivel a túlfutási hibák sokkal gyakoribbak az illesztőprogramokban, mint az aluláteresztési hibák.

Az egyedi memóriafoglalás felülbírálhatja ezeket a beállításokat, és kiválaszthatja saját igazítását az ExAllocatePoolWithTagPriority meghívásával, a prioritási paramétert a XxxSpecialPoolOverrun vagy XxxSpecialPoolUnderrun értékre állítva. (Ez a rutin nem tudja aktiválni vagy inaktiválni a speciális készlet funkciót, vagy nem kérheti a speciális készletet egy memóriafoglaláshoz, amely egyébként a normál készletből lenne lefoglalva. Ebből a rutinból csak az igazítás szabályozható.)

A Windows operációs rendszer Windows 7-ben és újabb verzióiban a Speciális készlet lehetőség támogatja a következő kernel API-k használatával lefoglalt memóriát:

Speciális medence medencetag vagy foglalási méret szerint

A Driver Verifier "különleges tárterület" funkciója mellett, amely egy adott illesztőprogram foglalásaihoz kér különleges tárterületet, további két módja is van annak használatának:

  • Készletcímke. Speciális medence kérése egy meghatározott készletcímkével rendelkező összes foglalás esetén.

  • Méret. Speciális pool kérése a megadott mérettartományban lévő összes foglaláshoz.

Ha különleges készletet igényel egy pool taghoz vagy mérettartományhoz, használja a Windows hibakeresési eszközei között található Gflags eszközt. További részletekért lásd : A Globális jelzők segédprogram használata.

Egyszerre használhatja a Driver Verifier speciális készletfunkcióját és a Gflags speciális készletfunkcióit. Ha igen, ne feledje, hogy a speciális készlet korlátozott, hogy nem minden kísérlet sikerül a speciális készletből való lefoglalásra, és hogy a Windows sikeres állapotot ad vissza a sikertelen lefoglalási kísérletekhez a speciális készletből, amelyeket a normál memóriakészletek foglalásai kielégítenek.

Speciális készlethatékonyság

Nem teljesül minden speciális készletkérés. A speciális készlet minden foglalása egy oldal nem lapozható fizikai memóriát és két oldal virtuális címterületet használ fel. Ha a készlet kimerült, a memória a szokásos módon lesz lefoglalva, amíg a speciális készlet újra elérhetővé nem válik. Ha egy speciális készletkérelem ki van töltve a standard készletből, a kérő függvény nem ad vissza hibát, mivel a készletkérelem sikeres volt. Ezért nem ajánlott egyszerre több illesztőprogramot ellenőrizni az aktivált 'Special Pool' funkció mellett.

Egyetlen illesztőprogram, amely sok kis memóriakérelmet végez, szintén kimerítheti ezt a készletet. Ha ez történik, célszerű lehet készletcímkéket rendelni az illesztőprogram memóriafoglalásaihoz, és a speciális készletet egyszerre egy készletcímkének szentelni.

A speciális készlet mérete a rendszer fizikai memóriájának mennyiségével nő; ideális esetben ennek legalább 1 gigabájtnak (GB) kell lennie. x86 gépeken, mivel a virtuális tér (a fizikai mellett) is használatban van, ne használja a /3GB indítási beállítást. Érdemes a pagefile minimális/maximális mennyiségét két vagy három tényezővel növelni.

Annak biztosítására, hogy a meghajtó összes erőforrás-kiosztását teszteljék, ajánlott hosszú ideig terhelni a meghajtót.

A speciális készlet figyelése

A készletfoglalásokkal kapcsolatos statisztikák monitorozása végezhető el. Ezeket megjelenítheti a Driver Verifier Manager, a Verifier.exe parancssor vagy egy naplófájl. Részletekért lásd Globális számlálók figyelése.

Ha a speciális készletben sikeres készletfoglalások számláló egyenlő a sikeres készletfoglalások számláló értékével, akkor a speciális készlet elegendő volt az összes memóriafoglalás fedezésére. Ha az előbbi számláló alacsonyabb, mint az utóbbi, akkor a speciális készlet legalább egyszer kimerült.

Ezek a számlálók nem követik nyomon azokat a foglalásokat, amelyek mérete egy oldal vagy nagyobb, mivel a speciális készlet nem alkalmazható rájuk.

Ha a speciális készlet funkció engedélyezve van, de a teljes készlet-hozzárendelések kevesebb mint 95%%-a lett a speciális készletből kiosztva, figyelmeztetés jelenik meg a Driver Verifier Managerben. A Windows 2000 rendszerben ez a figyelmeztetés megjelenik az illesztőprogram állapota képernyőn. A Windows XP és újabb verziókban ez a figyelmeztetés megjelenik a Globális számlálók képernyőn. Ha ez történik, ellenőrizze az illesztőprogramok rövidebb listáját, ellenőrizze az egyes készleteket készletcímke alapján, vagy adjon hozzá több fizikai memóriát a rendszerhez.

A kernel hibakereső bővítménye (!verifier ) a speciális készlethasználat figyelésére is használható. A Driver Verifier Managerhez hasonló információkat jelenít meg. További információ a hibakereső bővítményekről: Windows hibakeresési.

A speciális készlet opció aktiválása

A Speciális készlet funkciót egy vagy több illesztőprogramhoz aktiválhatja a Driver Verifier Manager vagy a Verifier.exe parancssor használatával. További részletekért lásd: Illesztőprogram-ellenőrző beállításainak kiválasztása.

Megjegyzés:

Ha készletcímke vagy foglalási méret alapján szeretné aktiválni a Speciális készlet funkciót, vagy be szeretné állítani a Start ellenőrzése (aláfutások észlelése) és a Befejezés ellenőrzése (túlfutások észlelése) igazítást, használja a Global Flags segédprogramot; ezek az igazítási beállítások az összes speciális készletfoglalásra vonatkoznak.

  • A parancssorban

    A parancssorban a Speciális készlet lehetőséget a 0. bit (0x1) jelöli. A Speciális készlet aktiválásához használjon 0x1 értékű jelzőt, vagy adjon hozzá 0x1-et a jelzőértékhez. Például:

    verifier /flags 0x1 /driver MyDriver.sys
    

    A funkció a következő rendszerindítás után aktív lesz.

    A speciális készletet a számítógép újraindítása nélkül is aktiválhatja és inaktiválhatja, ha hozzáadja a /volatile paramétert a parancshoz. Például:

    verifier /volatile /flags 0x1 /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 Speciális Pool funkció a standard beállításokban is megtalálható. Például:

    verifier /standard /driver MyDriver.sys
    
  • Driver Verifier Manager használata

    1. Válassza Egyéni beállítások létrehozása (kódfejlesztőknek) lehetőséget, majd kattintson a Továbbgombra.
    2. Válassza Egyéni beállítások kiválasztása a teljes listából.
    3. Válassza ki (ellenőrizze) a speciális készletet.

    A Speciális Készlet funkció a szokásos beállításokban is szerepel. A funkció használatához a Driver Verifier Managerben kattintson a Standard beállítások létrehozásaelemre.