Condividi tramite


Introduzione alle routine SynchCritSection

Le sezioni critiche sono sezioni di codice che richiedono l'accesso esclusivo alle risorse hardware o ai dati del driver. Questo significa che il codice non deve essere interrotto da altro codice che può fare riferimento alle stesse risorse o dati e le risorse o i dati non devono essere a cui fa riferimento più di un processore alla volta.

Le sezioni critiche devono essere limitate alle routine ISR e SynchCritSection . Il sistema chiama queste routine solo dopo aver generato l'IRQL del processore corrente al valore DIRQL del dispositivo e l'acquisizione di un blocco di spin. Dopo aver restituito una routine SynchCritSection , il sistema rilascia il blocco di rotazione e riduce l'IRQL del processore.

L'aumento del valore IRQL del processore al valore DIRQL del dispositivo impedisce l'interruzione del processore corrente, ad eccezione di un dispositivo con priorità superiore. L'acquisizione di un blocco di rotazione impedisce ad altri processori di eseguire qualsiasi codice di sezione critico associato a tale blocco di spin. Questo blocco di spin viene talvolta chiamato blocco di spin di interruzione.

Le routine StartIo e DpcForIsr o CustomDpc di un driver di dispositivo devono accedere spesso ad alcune delle stesse risorse hardware ( ad esempio registri di dispositivo o memoria relativa al bus) o ai dati gestiti dal driver come ISR del driver. A seconda del dispositivo o della progettazione del driver, il relativo invio, AdapterControl, ControllerControl o routine timer possono accedere anche alle risorse hardware o ai dati gestiti dal driver.

Per chiamare qualsiasi sezione critica non ISR, un driver deve usare la routine KeSynchronizeExecution . Questa routine accetta l'indirizzo di una routine SynchCritSection come input, insieme alle informazioni sul contesto definite dal driver e a un puntatore a oggetti di interruzione. Il sistema usa il puntatore a oggetti di interruzione per determinare il blocco DIRQL e spin da usare con la routine SynchCritSection . Il driver in precedenza ha fornito questi valori usando i parametri SpinLock e SyncIrql della funzione IoConnectInterrupt.