Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Sterowniki w trybie jądra mogą korzystać z ochrony wyczerpania, aby bezpiecznie uzyskiwać dostęp do obiektów w udostępnionej pamięci systemowej, które są tworzone i usuwane przez inny sterownik w trybie jądra.
Mówi się, że obiekt zostanie rozładowany, jeśli wszystkie zaległe dostępy do obiektu zostaną zakończone i nie zostaną przyznane żadne nowe żądania dostępu do obiektu. Na przykład może być konieczne uruchomienie obiektu udostępnionego, aby można go było usunąć i zastąpić nowym obiektem.
Sterownik, który jest właścicielem obiektu udostępnionego, może umożliwić innym sterownikom uzyskiwanie i zwalnianie ochrony stopniowego wygaszania na obiekcie. Gdy ochrona przed wyłączeniem działa, inny sterownik niż właściciel może uzyskać dostęp do obiektu bez ryzyka, że właściciel może usunąć obiekt przed zakończeniem dostępu. Przed rozpoczęciem dostępu sterownik, który uzyskuje dostęp, żąda ochrony przed zakłóceniami dla obiektu. W przypadku obiektu długotrwałego to żądanie jest prawie zawsze przyznawane. Po zakończeniu dostępu, sterownik dostępu zwalnia wcześniej nabytą ochronę przed zakończeniem działania obiektu.
Podstawowe procedury ochrony po uruchomieniu
Aby rozpocząć udostępnianie obiektu, sterownik, który jest właścicielem obiektu, wywołuje procedurę ExInitializeRundownProtection w celu zainicjowania ochrony uruchamiania obiektu. Po tym wywołaniu inne sterowniki, które uzyskują dostęp do obiektu, mogą uzyskać i zwolnić ochronę wygaszania na obiekcie.
Sterownik, który uzyskuje dostęp do obiektu udostępnionego, wywołuje procedurę ExAcquireRundownProtection , aby zażądać ochrony przed uruchomieniem obiektu. Po zakończeniu dostępu ten sterownik wywołuje procedurę ExReleaseRundownProtection w celu zwolnienia ochrony przed zmniejszeniem zasobów na obiekcie.
Jeśli sterownik będący właścicielem ustali, że obiekt udostępniony musi zostać usunięty, ten sterownik czeka na usunięcie obiektu do momentu zakończenia wszystkich zaległych dostępu do obiektu.
W ramach przygotowań do usunięcia obiektu udostępnionego sterownik właściciel wywołuje procedurę ExWaitForRundownProtectionRelease, aby poczekać na zakończenie działania obiektu. Podczas tego wywołania funkcja ExWaitForRundownProtectionRelease czeka na zwolnienie wszystkich wcześniej przyznanych instancji ochrony wygaszenia dla obiektu, ale uniemożliwia przyznanie nowych żądań tej ochrony. Po zakończeniu ostatniego chronionego dostępu i wydaniu wszystkich wystąpień ochrony przed zakończeniem działania funkcja ExWaitForRundownProtectionRelease zwalnia funkcję, a sterownik może bezpiecznie usunąć obiekt.
ExWaitForRundownProtectionRelease blokuje wykonywanie wątku sterownika wywołującego, dopóki wszystkie sterowniki, które posiadają ochronę przed zakończeniem działania na udostępnionym obiekcie, nie zwolnią tej ochrony. Aby zapobiec blokowaniu wykonywania funkcji ExWaitForRundownProtectionRelease przez zbyt długi czas, wątki sterowników, które uzyskują dostęp do obiektu udostępnionego, powinny unikać zawieszania się podczas przechowywania ochrony przed uruchomieniem obiektu. Z tego powodu uzyskiwanie dostępu do sterowników powinno wywołać funkcję ExAcquireRundownProtection i ExReleaseRundownProtection w regionie krytycznym lub chronionym regionie albo podczas uruchamiania w środowisku IRQL = APC_LEVEL.
Zastosowania ochrony przed rozładowaniem
Ochrona przed usunięciem podczas wykorzystywania jest przydatna w zapewnianiu dostępu do obiektu udostępnionego, który prawie zawsze jest dostępny, ale czasami może być konieczne usunięcie i zastąpienie. Sterowniki, które uzyskują dostęp do danych lub które wywołuje procedury w tym obiekcie, nie mogą próbować uzyskać dostępu do obiektu po jego usunięciu. W przeciwnym razie te nieprawidłowe dostępy mogą spowodować nieprzewidywalne zachowanie, uszkodzenie danych, a nawet awarię systemu.
Na przykład sterownik antywirusowy zwykle pozostaje załadowany w pamięci, gdy system operacyjny jest uruchomiony. Czasami może być konieczne odinstalowanie tego sterownika i zastąpienie go przez zaktualizowaną wersję sterownika. Inne sterowniki wysyłają żądania we/wy do sterownika antywirusowego, aby uzyskać dostęp do danych i procedur w tym sterowniku. Przed wysłaniem żądania we/wy składnik jądra, taki jak menedżer filtrów systemu plików, może uzyskać ochronę przed wygaszeniem, aby zabezpieczyć się przed przedwczesnym zwolnieniem sterownika antywirusowego podczas obsługi żądania we/wy. Po zakończeniu żądania wejścia/wyjścia można znieść ochronę wyczerpywania zasobów.
Ochrona po uruchomieniu nie serializuje dostępu do obiektu udostępnionego. Jeśli co najmniej dwa sterowniki mogą jednocześnie zapewniać ochronę przed równoczesnym dostępem do obiektu, a dostęp do tego obiektu musi być serializowany, należy użyć innych mechanizmów, takich jak blokada wzajemnego wykluczania, do serializacji dostępów.
Struktura EX_RUNDOWN_REF
Struktura EX_RUNDOWN_REF śledzi stan ochrony wyłączania na udostępnionym obiekcie. Ta struktura jest nieprzezroczysta dla sterowników. Procedury ochrony przed wyłączeniem dostarczone przez system używają tej struktury do zliczenia liczby wystąpień ochrony przed wyłączeniem, które obecnie mają wpływ na obiekt. Te procedury używają również tej struktury do śledzenia, czy obiekt zostaje zakończony, czy jest na etapie zakończenia.
Aby rozpocząć udostępnianie obiektu, sterownik, który jest właścicielem obiektu, wywołuje metodę ExInitializeRundownProtection , aby zainicjować strukturę EX_RUNDOWN_REF skojarzoną z obiektem. Po inicjalizacji sterownik właściciel może udostępnić tę strukturę pozostałym sterownikom, które wymagają dostępu do obiektu. Sterowniki dostępu przekazują tę strukturę jako parametr do wywołań ExAcquireRundownProtection i ExReleaseRundownProtection , które uzyskują i zwalniają ochronę uruchamiania obiektu. Sterownik właściciel przekazuje tę strukturę jako parametr do wywołania ExWaitForRundownProtectionRelease, które czeka na zamknięcie obiektu w celu jego bezpiecznego usunięcia.
Porównanie z blokadami
Ochrona przed wyłączeniem jest jednym z kilku sposobów zagwarantowania bezpiecznego dostępu do obiektu współdzielonego. Innym podejściem jest użycie blokady oprogramowania wzajemnego wykluczania. Jeśli sterownik wymaga dostępu do obiektu, który jest obecnie zablokowany przez inny sterownik, pierwszy sterownik musi poczekać, aż drugi sterownik zwolni blokadę. Jednak uzyskiwanie i zwalnianie blokad może prowadzić do wąskich gardeł wydajności, a blokady mogą zużywać duże ilości pamięci. Jeśli są używane nieprawidłowo, blokady mogą spowodować zakleszczenie sterowników, które konkurują o te same obiekty współdzielone. Wysiłki na rzecz wykrywania i unikania zakleszczeń zwykle wymagają przekierowania znacznych zasobów obliczeniowych.
W przeciwieństwie do blokad, ochrona przed zużywaniem się ma stosunkowo lekki czas przetwarzania i wymagania dotyczące pamięci. Prosty licznik referencji jest skojarzony z obiektem w celu zapewnienia odroczenia usunięcia obiektu do momentu ukończenia wszystkich niezakończonych dostępów do obiektu. Dzięki temu podejściu, zamiast programowych blokad wzajemnego wykluczenia, można używać atomowych, zsynchronizowanych instrukcji sprzętowych, aby zagwarantować bezpieczny dostęp do obiektu. Wywołania do uzyskiwania i zwalniania ochrony przed stanem wyczerpania są zazwyczaj szybkie. Korzyści wynikające z używania lekkiego mechanizmu, takiego jak ochrona przed wyczerpaniem, mogą być istotne dla obiektu współdzielonego, który ma długi czas użytkowania i jest współużytkowany przez wiele sterowników.
Inne procedury ochrony przed wyłączeniem
Dostępnych jest kilka innych procedur ochrony przed uruchomieniem, oprócz tych, które zostały wymienione wcześniej. Te dodatkowe procedury mogą być używane przez niektórych kierowców.
Procedury ExReInitializeRundownProtection umożliwiają skojarzenie wcześniej używanej struktury EX_RUNDOWN_REF z nowym obiektem i inicjuje ochronę uruchamiania na tym obiekcie.
Procedury ExRundownCompleted aktualizują strukturę EX_RUNDOWN_REF , aby wskazać, że uruchomienie skojarzonego obiektu zostało zakończone.
Procedury ExAcquireRundownProtectionEx i ExReleaseRundownProtectionEx są podobne do procedur ExAcquireRundownProtection i ExReleaseRundownProtection. Te cztery procedury zwiększają lub zmniejszają liczbę wystąpień ochrony przed wyłączeniem, które są aktywne dla obiektu współdzielonego. Podczas gdy ExAcquireRundownProtection i ExReleaseRundownProtection zwiększają i zmniejszają tę liczbę o jeden, ExAcquireRundownProtectionEx i ExReleaseRundownProtectionEx zwiększają i zmniejszają tę liczbę o dowolne wartości.
Ochrona uruchamiania z obsługą pamięci podręcznej
Obiekt rundown jest kompaktową i szybką strukturą danych, ale może powodować konflikty w pamięci podręcznej, gdy wiele procesorów próbuje uzyskać odwołanie jednocześnie. Może to mieć wpływ na wydajność i skalowalność sterownika.
Aby uniknąć tego problemu, możesz użyć odwołania rundown obsługującego pamięć podręczną w celu dystrybucji śledzenia odwołań w wielu wierszach pamięci podręcznej. Zmniejsza to rywalizację o pamięć podręczną i zwiększa wydajność sterownika na komputerach wieloprocesorowych.
Aby użyć odwołania do uruchamiania obsługującego pamięć podręczną, wykonaj następujące kroki:
- Utwórz obiekt EX_RUNDOWN_REF_CACHE_AWARE , wykonując jedną z następujących czynności:
- Wywołaj metodę ExAllocateCacheAwareRundownProtection. To zajmuje się inicjalizacją.
- Alternatywnie, aby kontrolować alokację pamięci, wywołaj funkcję ExSizeOfRundownProtectionCacheAware, przydziel bufor o rozmiarze zwróconym przez tę funkcję, a następnie przekaż ten bufor i rozmiar do funkcji ExInitializeRundownProtectionCacheAware.
- Zażądaj ochrony przed uruchomieniem obiektu przed uzyskaniem do niego dostępu, wywołując procedurę ExAcquireRundownProtectionCacheAware . Ta rutyna zwraca TRUE, jeśli żądanie zostało przyznane, lub FALSE, jeśli obiekt jest wyłączany.
- Po uzyskaniu dostępu do obiektu, należy zwolnić ochronę rundown, wywołując procedurę ExReleaseRundownProtectionCacheAware.
- Poczekaj, aż zakończy się działanie obiektu, zanim go usuniesz, wywołując procedurę ExWaitForRundownProtectionReleaseCacheAware. Ta rutyna blokuje bieżący wątek do momentu wydania wszystkich wystąpień ochrony przed uruchomieniem obiektu.
- Jeśli sterownik wywołał ExAllocateCacheAwareRundownProtection wcześniej, powinien wywołać ExFreeCacheAwareRundownProtection, aby zwolnić referencję do obiektu Rundown.
Aby ponownie użyć odwołania do rekordu przetwarzania z uwzględnieniem pamięci podręcznej, wykonaj następujące kroki:
- Po wywołaniu funkcji ExWaitForRundownProtectionReleaseCacheAware wywołaj metodę ExRundownCompletedCacheAware, aby wskazać, że zakończenie wycofywania się starego obiektu zostało dokonane.
- Wywołaj metodę ExReInitializeRundownProtectionCacheAware , aby ponownie zainicjować odwołanie po uruchomieniu skojarzonego obiektu.
- Teraz sterownik może ponownie wywołać funkcję ExAcquireRundownProtectionCacheAware.
Odwołanie rundown obsługujące pamięć podręczną oferuje lepszą wydajność i skalowalność w określonych sytuacjach, ale zużywa więcej pamięci niż zwykłe odwołanie typu rundown. Należy rozważyć ten kompromis przy wyborze między dwoma typami referencji wyczerpujących.