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.
Zazwyczaj procedury InterruptService lub InterruptMessageService (ISR) sterownika muszą udostępniać dostęp do danych sterowników i zasobów sprzętowych innym procedurom sterowników. Ze względu na to, że ISR są wykonywane w kontekście przerwania na podwyższonym poziomie IRQL, a ponieważ system może mieć wiele procesorów, ważna jest synchronizacja dostępu do współdzielonych danych i zasobów, aby zagwarantować, że każda procedura będzie tymczasowo mieć wyłączny dostęp do tych współdzielonych informacji, bez przerwań.
System obsługuje tę synchronizację, wykonując ISR w krytycznej sekcji przerwań. Przerwanie ma przypisaną blokadę spin, blokadę spin przerwania i IRQL, synchronizację przerwań IRQL. System gwarantuje, że kod wykonany w sekcji krytycznej ma zapewniony wyłączny dostęp do udostępnionych informacji, przez podniesienie IRQL procesora do poziomu synchronizacji przerwań IRQL i uzyskanie blokady spinowej przerwania przed wykonaniem kodu. System zawsze wchodzi do sekcji krytycznej przerwania przed wykonaniem swojego ISR. Różne przerwania mogą współdzielić tę samą sekcję krytyczną, współdzieląc blokadę spin przerwań i poziom synchronizacji IRQL.
Sterowniki mogą implementować kod, który działa w sekcji krytycznej przerwania, poprzez dostarczenie funkcji SynchCritSection. Gdy sterownik używa metody KeSynchronizeExecution do wywołania procedury SynchCritSection , system automatycznie wprowadza sekcję krytyczną dla przerwania określonego przez parametr Przerwanie .
Podniesienie poziomu IRQL procesora do poziomu synchronizacji przerwania IRQL uniemożliwia przerwanie bieżącego procesora, z wyjątkiem przerwania z wyższym poziomem synchronizacji IRQL. Uzyskanie blokady spin uniemożliwia innym procesorom wykonywanie dowolnego krytycznego kodu sekcji skojarzonego z tą blokadą spin.
System przypisuje przerwanie spin lock and synchronization IRQL dla przerwania, gdy sterownik wywołuje IoConnectInterruptEx. W większości przypadków sterownik może zezwolić systemowi na określenie obu wartości:
Jeśli sterownik używa wersji CONNECT_LINE_BASED IoConnectInterruptEx i określa blokadę spin NULL, system przydzieli blokadę spin dla linii przerwania. System określa również wartość poziomu IRQL synchronizacji (sterowniki mogą dodatkowo określić wyższą wartość).
Jeśli sterownik używa wersji CONNECT_MESSAGE_BASED IoConnectInterruptEx i określa nieokreśloną blokadę spin, system przydzieli blokadę spin dla każdego komunikatu przerwania. System określa również wartość protokołu IRQL synchronizacji dla każdego komunikatu (sterowniki mogą opcjonalnie określić wyższą wartość, która będzie wspólna dla wszystkich komunikatów).
Sterownik musi przydzielić własną blokadę obrotu tylko w przypadku korzystania z wersji CONNECT_FULLY_SPECIFIED IoConnectInterruptEx oraz gdy posiadane wektory przerwań muszą współdzielić tę samą sekcję krytyczną. Sterownik może określić własną blokadę spin i poziom synchronizacji IRQL, używając elementów SpinLock i SynchronizeIrql struktury IO_CONNECT_INTERRUPT_PARAMETERS. Aby uzyskać więcej informacji, zobacz IO_CONNECT_INTERRUPT_PARAMETERS.
Aby uzyskać informacje na temat pisania i wprowadzania sekcji krytycznych, zobacz Używanie sekcji krytycznych.