Udostępnij przez


Synchronizacja minidrivera

Deweloperzy mikrosterowników przesyłania strumieniowego mają możliwość umożliwienia sterownikowi klasy zarządzanie synchronizacją. Gdy minidriverzy rejestrują się za pomocą sterownika klasy, mogą zdecydować się na synchronizację zapewnianą przez klasę, ustawiając element członkowski TurnOffSynchronizationHW_INITIALIZATION_DATA na FALSE.

Gdy sterownik klasy obsługuje synchronizację, gwarantuje, że dwa fragmenty kodu minidriver nigdy nie są wykonywane jednocześnie. Sterownik klasy kolejkuje wszystkie żądania strumienia, i przekazuje je do mini-sterownika pojedynczo.

Jednym z celów tej synchronizacji jest odciążenie programisty minikierowcy od konieczności zajmowania się wszystkimi szczegółami synchronizacji sterowników i kolejkowania żądań w środowisku wielozadaniowym, przerejestrowywalnym, multiprocesorowym. Jednak niektóre minidrivery nie powinny go używać. Dwa przykłady znajdują się w temacie Przykłady synchronizacji , które ilustrują, co minidriver musi zrobić w odniesieniu do synchronizacji.

Wyłączenie synchronizacji klas strumienia oznacza, że wszystkie żądania są natychmiast i asynchronicznie wywoływane do minidriver w kontekście przesyłania wątku w PASSIVE_LEVEL. Wyjątki od powyższej reguły to procedury HwCancelPacket, TimeoutHandler i Timer. Są one wywoływane na poziomie DISPATCH_LEVEL. Ostatnim wyjątkiem jest procedura obsługi przerwań, która jest wywoływana w DIRQL.

Gdy synchronizacja jest wyłączona, minidriver jest odpowiedzialny za wykonywanie synchronizacji zgodnie z modelem WDM. Jeśli minidriver jest wywoływany z powrotem w PASSIVE_LEVEL, może zostać wywłaszczone przez wszelkie wyższe zdarzenia IRQL, takie jak DPC lub przerwania. Podobnie, jeśli minidriver jest wywoływany z powrotem w DISPATCH_LEVEL, może następnie zostać wywłaszczone przez przerwania. Funkcje minidrivera, które manipulują współdzielonymi zasobami, muszą synchronizować dostęp.

Wiele żądań może być jednocześnie wystawianych na te same lub różne strumienie, gdy synchronizacja klas strumienia jest wyłączona. Minidriver musi kolejkować własne żądania i obsługiwać wszelkie synchronizacje sprzętu z innymi wątkami i ISR. Spin locki, muteksy i KeSynchronizeExecution to niektóre obiekty synchronizacji dostępne dla minidriverów strumieniowych działających bez synchronizacji klas strumieniowych.