ISR de Passive-Level
A partir de Windows 8, el marco de controlador en modo kernel (KMDF) y los controladores del marco de controladores en modo de usuario (UMDF) pueden, como opción, registrar sus rutinas de servicio de interrupción (ISR) para ejecutarse en el nivel pasivo.
Para obtener más información sobre los ISR de nivel pasivo para controladores KMDF y UMDF, consulte los temas siguientes:
Si un dispositivo periférico usa una patilla de E/S de uso general (GPIO) para retransmitir una solicitud de interrupción al procesador, la abstracción de interrupción de Windows permite convenientemente al controlador para que este dispositivo omita los detalles específicos del hardware del controlador GPIO al que pertenece este pin. Cuando el controlador de captura de kernel se ejecuta en respuesta a una solicitud de interrupción retransmitida por GPIO del dispositivo, este controlador borra o enmascara automáticamente, según sea necesario, la interrupción en los registros de hardware GPIO. Además, el controlador de captura de kernel llama directamente al ISR del dispositivo o programa este ISR para que se ejecute en otro subproceso.
Con frecuencia, los registros de hardware gpIO están asignados a la memoria, en cuyo caso el controlador de captura de kernel puede acceder directamente a ellos en DIRQL. Sin embargo, es posible que los registros de hardware del dispositivo periférico no estén asignados a la memoria, en cuyo caso, el controlador de dispositivo periférico debe usar solicitudes de E/S para acceder a ellos. Si es así, el ISR del controlador de dispositivo periférico debe ejecutarse en IRQL = PASSIVE_LEVEL para que pueda usar solicitudes de E/S para silenciar la interrupción o para realizar el mantenimiento inicial de la interrupción. Un ISR de nivel pasivo puede enviar una solicitud de E/S de forma sincrónica y, si es necesario, bloquear hasta que se complete la solicitud.
Para admitir un ISR de nivel pasivo para un dispositivo periférico que genera una señal de solicitud de interrupción desencadenada por el borde, el controlador de captura de kernel borra la interrupción pendiente en el pin GPIO y, a continuación, programa el ISR para que se ejecute en un subproceso de kernel de nivel pasivo.
Para admitir un ISR de nivel pasivo para un dispositivo periférico que genera una señal de solicitud de interrupción desencadenada por el nivel, el controlador de capturas de kernel enmascara la interrupción pendiente en el pin GPIO y, a continuación, programa el ISR para que se ejecute en un subproceso de kernel de nivel pasivo. El ISR es responsable de borrar la solicitud de interrupción en el dispositivo periférico. Una vez devuelto el ISR, el subproceso del kernel desenmasca la interrupción en el pin GPIO.
Dado que la interrupción permanece enmascarada hasta que el ISR vuelve, el ISR de nivel pasivo del dispositivo debe realizar solo el mantenimiento inicial de la interrupción y, a continuación, volver para evitar retrasar los ISR de nivel pasivo para otros dispositivos. Normalmente, el controlador debe aplazar el procesamiento adicional relacionado con interrupciones al subproceso de trabajo de interrupción, que se ejecuta con una prioridad menor que el ISR.