Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
In genere, le routine InterruptService o InterruptMessageService (ISR) di un driver devono condividere l'accesso ai dati del driver e alle risorse hardware con altre routine del driver. Poiché gli ISR vengono eseguiti in un contesto di interrupt in un IRQL con privilegi elevati e poiché un sistema potrebbe avere più processori, è importante sincronizzare l'accesso a dati e risorse condivisi in modo che ogni routine possa avere accesso temporaneamente esclusivo a queste informazioni condivise, senza interruzioni.
Il sistema supporta questa sincronizzazione eseguendo l'ISR all'interno di una sezione critica di interruzione. Un interrupt ha un blocco di selezione assegnato, il blocco di spin di interrupt e IRQL, la sincronizzazione di interrupt IRQL. Il sistema garantisce a questo codice, eseguendolo all'interno della sezione critica, l'accesso esclusivo alle informazioni condivise, alzando l'IRQL del processore al livello IRQL di sincronizzazione degli interrupt e acquisendo il blocco di spin degli interrupt prima di eseguire il codice. Il sistema entra sempre nella sezione critica dell'interrupt prima di eseguire il relativo ISR. Interruzioni diverse possono condividere la stessa sezione critica condividendo il blocco di rotazione di interrupt e la sincronizzazione IRQL.
I driver possono implementare codice eseguito nella sezione critica dell'interrupt fornendo una routine SynchCritSection . Quando il driver usa KeSynchronizeExecution per chiamare la routine SynchCritSection , il sistema immette automaticamente la sezione critica per l'interrupt specificato dal parametro Interrupt .
L'aumento del livello IRQL del processore al livello IRQL di sincronizzazione dell'interrupt impedisce l'interruzione del processore corrente, eccetto per un interrupt con un livello IRQL di sincronizzazione superiore. L'acquisizione di un blocco di selezione impedisce ad altri processori di eseguire qualsiasi codice di sezione critico associato a tale blocco di selezione.
Il sistema assegna lo spinlock dell'interrupt e il livello IRQL di sincronizzazione per l'interrupt quando il driver chiama IoConnectInterruptEx. Nella maggior parte dei casi, il driver può consentire al sistema di determinare entrambi i valori:
Se il driver usa la versione CONNECT_LINE_BASED di IoConnectInterruptEx e specifica un blocco di selezione NULL , il sistema allocherà un blocco di selezione per la riga di interruzione. Il sistema determina anche il valore per l'IRQL di sincronizzazione (i driver possono facoltativamente specificare un valore superiore).
Se il driver usa la versione CONNECT_MESSAGE_BASED di IoConnectInterruptEx e specifica un blocco di selezione NULL , il sistema allocherà un blocco di selezione per ogni messaggio di interruzione. Il sistema determina anche il valore dell'IRQL di sincronizzazione per ogni messaggio (i driver possono, facoltativamente, specificare un valore più alto che sarà comune a tutti i messaggi).
Un driver deve allocare il proprio spin lock solo quando utilizza la versione CONNECT_FULLY_SPECIFIED di IoConnectInterruptEx e quando ha più vettori di interrupt che devono condividere la stessa sezione critica. Un driver può specificare il proprio spinlock e sincronizzare IRQL usando i membri SpinLock e SynchronizeIrql di IO_CONNECT_INTERRUPT_PARAMETERS. Per altre informazioni, vedere IO_CONNECT_INTERRUPT_PARAMETERS.
Per informazioni sulla scrittura e l'immissione di sezioni critiche, vedere Uso di sezioni critiche.