Udostępnij przez


Specjalne wykrywanie uszkodzeń pamięci puli w narzędziu weryfikacji sterowników

Uszkodzenie pamięci jest typowym problemem ze sterownikiem. Błędy sterowników mogą powodować awarie długo po wystąpieniu błędów. Najbardziej typowe z tych błędów jest uzyskiwanie dostępu do pamięci, która została już zwolniona, i przydzielanie n bajtów, a następnie uzyskiwanie dostępu do n+1 bajtów.

Aby wykryć uszkodzenie pamięci, weryfikator sterowników może przydzielić pamięć sterownika ze specjalnej puli i monitorować pulę pod kątem nieprawidłowego dostępu. Specjalna obsługa puli jest dostępna dla procedur dostarczanych przez system w trybie jądra, takich jak ExAllocatePoolWithTag , a także dla procedur dostarczanych przez system GDI, takich jak EngAllocMem.

Pula specjalna według alignacji

Dostępne są dwa ustawienia specjalnej puli:

  • Wyrównanie Weryfikuj rozpoczęcie jest lepsze w wykrywaniu podbiegów dostępu.
  • Wyrównanie końcowe weryfikacji lepiej wykrywa przekroczenia dostępu.

Aby uzyskać więcej informacji na temat używania opcji Sprawdź początek i Sprawdź koniec, zobacz Wykrywanie przekroczeń i niedoborów. Warto zauważyć, że zdecydowana większość uszkodzeń pamięci jest spowodowana przekroczeniami, a nie niedoprzepełnieniami.

Gdy funkcja Pula specjalna jest aktywna i wybrano opcję Weryfikuj koniec, każda alokacja pamięci żądana przez sterownik zostanie umieszczona na oddzielnej stronie. Zwracany jest najwyższy możliwy adres, który umożliwia dopasowanie alokacji na stronie, dzięki czemu pamięć jest wyrównana do końca strony. Poprzednia część strony jest napisana przy użyciu specjalnych wzorców. Poprzednia strona i następna strona są oznaczone jako niedostępne.

Jeśli sterownik spróbuje uzyskać dostęp do pamięci po zakończeniu przydziału pamięci, Driver Verifier wykryje to natychmiast i wyda sprawdzenie błędu 0xCD. Jeśli sterownik zapisuje w pamięci przed początkiem bufora, spowoduje to (prawdopodobnie) zmianę wzorców. Po zwolnieniu bufora, weryfikator sterownika wykryje zmianę i wyda Bug Check 0xC1.

Jeśli sterownik odczytuje lub zapisuje w buforze po jego zwolnieniu, weryfikator sterowników wyda Błąd krytyczny 0xCC.

Po wybraniu opcji Weryfikuj Początek bufor pamięci jest wyrównany do początku strony. Dzięki temu ustawieniu niedobory danych powodują natychmiastową kontrolę błędów, a nadmiary danych powodują kontrolę błędów po zwolnieniu pamięci. Ta opcja jest w inny sposób identyczna z opcją Weryfikuj zakończenie .

Sprawdź, czy wartość End jest domyślnym wyrównaniem, ponieważ błędy przekroczenia są znacznie bardziej typowe w sterownikach niż błędy underrun.

Alokacja pojedyncza pamięci może zastąpić te preferencje i wybrać jej wyrównanie, wywołując funkcję ExAllocatePoolWithTagPriority z parametrem Priority ustawionym na XxxSpecialPoolOverrun lub XxxSpecialPoolUnderrun. (Ta rutyna nie może aktywować ani dezaktywować funkcji Puli specjalnej lub zażądać specjalnej puli dla alokacji pamięci, która w przeciwnym razie zostanie przydzielona z normalnej puli. Tylko wyrównanie można kontrolować z tej procedury.

W systemie operacyjnym Windows 7 i nowszych wersjach systemu operacyjnego Windows opcja Specjalna Pula obsługuje pamięć, która została przydzielona przy użyciu następujących interfejsów API jądra:

Specjalna pula według tagu puli lub rozmiaru alokacji

Oprócz funkcji Specjalnej Puli w Weryfikatorze Sterowników, która żąda użycia specjalnej puli dla alokacji przez określony sterownik, istnieją dwa inne sposoby korzystania ze specjalnej puli:

  • Tag puli. Zażądaj specjalnej puli dla wszystkich alokacji z określonym tagiem puli.

  • Rozmiar. Poproś o przydzielenie specjalnej puli dla wszystkich alokacji w wyznaczonym przedziale rozmiarów.

Aby zażądać specjalnej puli dla tagu puli lub zakresu rozmiarów, użyj narzędzia Gflags, narzędzia dołączonego do narzędzi debugowania dla systemu Windows. Aby uzyskać szczegółowe informacje, zobacz Using the Global Flags Utility (Używanie narzędzia flag globalnych).

Można użyć funkcji specjalnej puli weryfikatora sterowników oraz specjalnych funkcji puli Gflags w tym samym czasie. Jeśli tak, pamiętaj, że specjalna pula jest ograniczona, że nie wszystkie próby przydzielenia z puli specjalnej się powiodą i że system Windows zwróci stan powodzenia dla nieudanych prób przydzielenia z puli specjalnej, które zostają spełnione poprzez alokacje ze standardowych pul pamięci.

Specjalna wydajność puli

Nie wszystkie żądania puli specjalnej są spełnione. Każda alokacja ze specjalnej puli używa jednej strony pamięci fizycznej, która nie podlega stronicowaniu, i dwóch stron wirtualnej przestrzeni adresowej. Jeśli pula zostanie wyczerpana, pamięć zostanie przydzielona w standardowy sposób do momentu ponownego udostępnienia puli specjalnej. Po wypełnieniu żądania specjalnej puli z puli standardowej, funkcja żądająca nie zwraca błędu, ponieważ żądanie puli zakończyło się pomyślnie. W związku z tym nie zaleca się weryfikowania wielu sterowników jednocześnie w przypadku aktywowania funkcji Puli specjalnej.

Pojedynczy sterownik, który wykonuje wiele małych żądań pamięci, również może wyczerpać tę pulę. W takim przypadku lepszym rozwiązaniem może być przypisanie tagów puli do alokacji pamięci sterownika i przydzielenie specjalnej puli do jednego tagu puli naraz.

Rozmiar specjalnej puli zwiększa się wraz z ilością pamięci fizycznej w systemie; najlepiej mieć co najmniej 1 gigabajt (GB). Na maszynach x86, ponieważ jest używane miejsce wirtualne (oprócz fizycznego), nie używaj opcji rozruchu /3GB . Dobrym pomysłem jest również zwiększenie wartości minimalnej/maksymalnej pliku stronicowania dwukrotnie lub trzykrotnie.

Aby upewnić się, że wszystkie alokacje kierowcy są testowane, zaleca się przeciążenie sterownika przez długi czas.

Monitorowanie specjalnej puli

Statystyki dotyczące alokacji puli można monitorować. Mogą być one wyświetlane przez Menedżer Weryfikatora Sterowników, Verifier.exe wiersz polecenia lub w pliku dziennika. Aby uzyskać szczegółowe informacje, zobacz Monitorowanie liczników globalnych .

Jeśli licznik Pomyślnych alokacji puli w specjalnej puli jest równy licznikowi Pomyślnych alokacji puli, to specjalna pula była wystarczająca do pokrycia wszystkich alokacji pamięci. Jeśli pierwszy licznik jest niższy niż ten ostatni, specjalna pula została wyczerpana co najmniej raz.

Te liczniki nie śledzą alokacji, których rozmiar to jedna lub większa strona, ponieważ specjalna pula nie ma dla nich zastosowania.

Jeśli funkcja Puli specjalnej jest włączona, ale mniej niż 95% wszystkich alokacji puli zostały przypisane ze specjalnej puli, w Menedżerze weryfikatora sterowników zostanie wyświetlone ostrzeżenie. W systemie Windows 2000 to ostrzeżenie zostanie wyświetlone na ekranie Stan sterownika . W systemie Windows XP i nowszym to ostrzeżenie będzie wyświetlane na ekranie Liczniki globalne . W takim przypadku należy sprawdzić krótszą listę sterowników, zweryfikować poszczególne pule według tagu puli lub dodać więcej pamięci fizycznej do systemu.

Rozszerzenie debugera jądra !verifier może również służyć do monitorowania wykorzystania puli specjalnej. Przedstawia podobne informacje jak te z Menedżera Weryfikacji Sterowników. Aby uzyskać informacje o rozszerzeniach debugera, zobacz Debugowanie systemu Windows.

Aktywowanie specjalnej opcji puli

Funkcję Puli specjalnej można aktywować dla co najmniej jednego sterownika przy użyciu Menedżera weryfikatora sterowników lub wiersza polecenia Verifier.exe. Aby uzyskać szczegółowe informacje, zobacz Wybieranie opcji weryfikatora sterowników.

Uwaga / Notatka

Aby aktywować funkcję Puli specjalnej według tagu puli lub rozmiaru alokacji albo ustawić wyrównanie Zweryfikuj początek (wykrywanie podbiegów) i Zweryfikuj koniec (wykrywanie przekroczeń), użyj Narzędzia Global Flags; te ustawienia wyrównania mają zastosowanie do wszystkich specjalnych alokacji puli.

  • W wierszu polecenia

    W wierszu polecenia opcja Pula specjalna jest reprezentowana przez bit 0 (0x1). Aby aktywować pulę specjalną, użyj wartości flagi 0x1 lub dodaj 0x1 do wartości flagi. Przykład:

    verifier /flags 0x1 /driver MyDriver.sys
    

    Funkcja będzie aktywna po następnym rozruchu.

    Yyou może również aktywować i dezaktywować specjalną pulę bez ponownego uruchamiania komputera przez dodanie /volatile parametru do polecenia. Przykład:

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

    To ustawienie jest skuteczne natychmiast, ale zostanie utracone po zamknięciu lub ponownym uruchomieniu komputera. Aby uzyskać szczegółowe informacje, zobacz Używanie zmiennych ustawień.

    Funkcja specjalnej puli jest również dostępna w ustawieniach standardowych. Przykład:

    verifier /standard /driver MyDriver.sys
    
  • Korzystanie z Menedżera weryfikatora sterowników

    1. Wybierz pozycję Utwórz ustawienia niestandardowe (dla deweloperów kodu), a następnie kliknij przycisk Dalej.
    2. Wybierz poszczególne ustawienia z pełnej listy.
    3. Wybierz (zaznacz) Specjalną pulę.

    Funkcja specjalnej puli jest również dostępna w ustawieniach standardowych. Aby użyć tej funkcji, w Menedżerze weryfikatora sterowników kliknij pozycję Utwórz ustawienia standardowe.