Passive-Level ISRs
Começando com Windows 8, os drivers KMDF (estrutura de driver no modo kernel) e UMDF (estrutura de driver de modo de usuário) podem, como opção, registrar suas ISRs (rotinas de serviço de interrupção) para serem executadas em nível passivo.
Para obter mais informações sobre ISRs de nível passivo para drivers KMDF e UMDF, consulte os seguintes tópicos:
Se um dispositivo periférico usa um pino de E/S de uso geral (GPIO) para retransmitir uma solicitação de interrupção para o processador, a abstração de interrupção do Windows convenientemente permite que o driver deste dispositivo ignore os detalhes específicos de hardware do controlador GPIO ao qual esse pino pertence. Quando o manipulador de interceptação de kernel é executado em resposta a uma solicitação de interrupção retransmitida por GPIO do dispositivo, esse manipulador limpa ou mascara automaticamente, conforme necessário, a interrupção nos registros de hardware gpio. Além disso, o manipulador de interceptação de kernel chama diretamente o ISR do dispositivo ou agenda esse ISR para ser executado em outro thread.
Frequentemente, os registros de hardware gpio são mapeados em memória, nesse caso, o manipulador de interceptação de kernel pode acessá-los diretamente no DIRQL. No entanto, os registros de hardware do dispositivo periférico podem não ser mapeados para memória, nesse caso, o driver de dispositivo periférico deve usar solicitações de E/S para acessá-los. Nesse caso, o ISR para o driver de dispositivo periférico deve ser executado em IRQL = PASSIVE_LEVEL para que ele possa usar solicitações de E/S para silenciar a interrupção ou para executar a manutenção inicial da interrupção. Um ISR de nível passivo pode enviar uma solicitação de E/S de forma síncrona e, se necessário, bloquear até que a solicitação seja concluída.
Para dar suporte a um ISR de nível passivo para um dispositivo periférico que gera um sinal de solicitação de interrupção disparado por borda, o manipulador de interceptação de kernel limpa a interrupção pendente no pino gpio e, em seguida, agenda o ISR para ser executado em um thread de kernel de nível passivo.
Para dar suporte a um ISR de nível passivo para um dispositivo periférico que gera um sinal de solicitação de interrupção disparado em nível, o manipulador de interceptação de kernel mascara a interrupção pendente no pino gpio e, em seguida, agenda o ISR para ser executado em um thread de kernel de nível passivo. O ISR é responsável por limpar a solicitação de interrupção no dispositivo periférico. Depois que o ISR retorna, o thread do kernel desmascara a interrupção no pino gpio.
Como a interrupção permanece mascarada até que o ISR retorne, o ISR de nível passivo do dispositivo deve executar apenas a manutenção inicial da interrupção e, em seguida, retornar para evitar atrasar ISRs de nível passivo para outros dispositivos. Normalmente, o driver deve adiar o processamento adicional relacionado à interrupção para o thread de trabalho de interrupção, que é executado com uma prioridade menor do que o ISR.