Compartir a través de


ISR de Passive-Level

A partir de Windows 8, el framework para controladores en modo kernel (KMDF) y los controladores del framework 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 este dispositivo omitir 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 desde el dispositivo, este controlador borra o enmascara automáticamente, según sea necesario, la interrupción en los registros de hardware GPIO. Además, el manejador de excepciones del 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 excepciones del núcleo borra la interrupción pendiente en el pin GPIO y luego programa el ISR para que se ejecute en un subproceso de núcleo 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 activada por nivel, el manejador de trampas del 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 retorna, la rutina de servicio de interrupciones (ISR) en nivel pasivo del dispositivo debe realizar solo la atención inicial de la interrupción y, a continuación, retornar para evitar retrasar las ISR en nivel pasivo de otros dispositivos. Normalmente, el controlador debe aplazar el procesamiento adicional relacionado con la interrupción al subproceso de trabajo de interrupción, que se ejecuta con una prioridad menor que el ISR.