Condividi tramite


isr di Passive-Level

A partire da Windows 8, il framework del driver in modalità kernel (KMDF) e i driver UMDF (User-Mode Driver Framework) possono, come opzione, registrare le routine del servizio di interrupt (ISR) per l'esecuzione a livello passivo.

Per altre informazioni sugli ISR a livello passivo per i driver KMDF e UMDF, vedere gli argomenti seguenti:

Se un dispositivo periferico usa un pin GPIO (General-Purpose I/O) per inoltrare una richiesta di interruzione al processore, l'astrazione interrupt di Windows consente al driver per questo dispositivo di ignorare i dettagli specifici dell'hardware del controller GPIO a cui appartiene questo pin. Quando il gestore trap del kernel viene eseguito in risposta a una richiesta di interrupt inoltrata da GPIO dal dispositivo, questo gestore cancella o maschera automaticamente, in base alle esigenze, l'interrupt nei registri hardware GPIO. Inoltre, il gestore trap del kernel chiama direttamente l'ISR del dispositivo o pianifica l'esecuzione di questo ISR in un altro thread.

Spesso, i registri hardware GPIO sono mappati alla memoria, nel qual caso il gestore trap del kernel può accedervi direttamente in DIRQL. Tuttavia, i registri hardware del dispositivo periferico potrebbero non essere mappati alla memoria. In questo caso, il driver di dispositivo periferico deve usare le richieste di I/O per accedervi. In tal caso, l'ISR per il driver di dispositivo periferico deve essere eseguito in IRQL = PASSIVE_LEVEL in modo che possa usare le richieste di I/O per disattivare l'interruzione o per eseguire la manutenzione iniziale dell'interrupt. Un ISR a livello passivo può inviare in modo sincrono una richiesta di I/O e, se necessario, bloccare fino al completamento della richiesta.

Per supportare un ISR a livello passivo per un dispositivo periferico che genera un segnale di richiesta di interruzione attivato da edge, il gestore trap del kernel cancella l'interruzione in sospeso al pin GPIO e quindi pianifica l'esecuzione dell'ISR in un thread kernel a livello passivo.

Per supportare un ISR a livello passivo per un dispositivo periferico che genera un segnale di richiesta di interrupt attivato a livello di livello, il gestore di trap del kernel maschera l'interruzione in sospeso al pin GPIO e quindi pianifica l'esecuzione dell'ISR in un thread kernel a livello passivo. L'ISR è responsabile della cancellazione della richiesta di interruzione nel dispositivo periferico. Al termine della restituzione dell'ISR, il thread del kernel annulla il mascherare l'interrupt nel pin GPIO.

Poiché l'interrupt rimane mascherato fino al ritorno dell'ISR, l'ISR a livello passivo del dispositivo deve eseguire solo la manutenzione iniziale dell'interrupt e quindi tornare a evitare di ritardare gli ISR a livello passivo per altri dispositivi. In genere, il driver deve rinviare l'elaborazione aggiuntiva correlata agli interrupt al thread di lavoro di interrupt, che viene eseguito con una priorità inferiore rispetto all'ISR.