Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Rutiny InterruptService nebo InterruptMessageService (ISRS) musí obvykle sdílet přístup k datům ovladačů a hardwarovým prostředkům s jinými rutinami ovladačů. Vzhledem k tomu, že isrs se spouštějí v kontextu přerušení v prostředí IRQL se zvýšenými oprávněními a protože systém může mít více procesorů, je důležité synchronizovat přístup ke sdíleným datům a prostředkům, aby každá rutina mohla mít k tomuto sdílenému informacím dočasně výhradní přístup bez přerušení.
Systém tuto synchronizaci podporuje spuštěním isR v přerušení kritického oddílu. Přerušení má přiřazený spin lock přerušenía IRQL, synchronizační IRQL přerušení. Systém zaručuje tomuto kódu spouštěnému v kritické části exkluzivní přístup ke sdíleným informacím tím, že zvýší IRQL procesoru na úroveň synchronizace přerušení IRQL a před spuštěním kódu získá zámek přerušení. Systém vždy přejde do kritické části přerušení před spuštěním svého ISR. Různé přerušení můžou sdílet stejnou kritickou část sdílením zámku přerušení a synchronizace IRQL.
Ovladače mohou implementovat kód, který se spouští v kritické části přerušení zadáním rutiny SynchCritSection. Pokud ovladač používá KeSynchronizeExecution k volání rutiny SynchCritSection, systém automaticky zadá kritickou část pro přerušení určenou parametrem Přerušení.
Zvýšení IRQL procesoru na synchronizační IRQL přerušení zabraňuje přerušení aktuálního procesoru, s výjimkou přerušení s vyšším synchronizačním IRQL. Získání spin locku brání ostatním procesorům v provádění jakéhokoli kódu kritické sekce přidruženého k danému spin locku.
Systém přiřadí zamykání přerušení a synchronizaci IRQL pro přerušení, když ovladač volá IoConnectInterruptEx. Ve většině případů může ovladač umožnit systému určit obě hodnoty:
Pokud ovladač používá verzi CONNECT_LINE_BASED IoConnectInterruptExa specifikuje spin lock NULL, systém přidělí spin lock pro přerušovací linku. Systém také určuje hodnotu pro synchronizační IRQL (ovladače mohou zadat vyšší hodnotu).
Pokud ovladač používá CONNECT_MESSAGE_BASED verzi IoConnectInterruptExa určuje NULL spin lock, systém přidělí zámek spinu pro každou zprávu přerušení. Systém také určuje hodnotu synchronizační knihovny IRQL pro každou zprávu (ovladače mohou volitelně zadat vyšší hodnotu, která bude společná pro všechny zprávy).
Ovladač musí přidělit svůj vlastní spinový zámek pouze při použití CONNECT_FULLY_SPECIFIED verze IoConnectInterruptEx a pokud má více vektorů přerušení, které musí sdílet stejnou kritickou sekci. Ovladač může určit vlastní zámek otáčení a synchronizaci IRQL pomocí členů SpinLock a SynchronizeIrql struktury IO_CONNECT_INTERRUPT_PARAMETERS. Další informace najdete na stránce IO_CONNECT_INTERRUPT_PARAMETERS.
Informace o psaní a zadávání kritických oddílů najdete v části Použití kritických oddílů.