Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
A partir do Windows 8, os drivers KMDF (kernel-mode driver framework) e UMDF (user-mode driver framework) podem, como opção, registrar suas rotinas de serviço de interrupção (ISRs) 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 (GPIO) de uso geral para retransmitir uma solicitação de interrupção para o processador, a abstração de interrupção do Windows convenientemente permite que o driver desse dispositivo ignore os detalhes específicos de hardware do controlador GPIO ao qual esse pino pertence. Quando o manipulador de trap do 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 trap do kernel chama diretamente o ISR do dispositivo ou agenda esse ISR para ser executado em outro thread.
Frequentemente, os registos de hardware GPIO são mapeados na memória, caso em que o manipulador de trap do kernel pode acessá-los diretamente no DIRQL. No entanto, os registros de hardware do dispositivo periférico podem não estar mapeados na memória, caso em que o driver de dispositivo periférico deve usar solicitações de E/S para acessá-los. Em caso afirmativo, 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 suportar um ISR em nível passivo para um dispositivo periférico que gera um sinal de pedido de interrupção acionado por borda, o manipulador de exceções do kernel limpa a interrupção pendente no pino GPIO e, em seguida, agenda o ISR para ser executado em uma thread do kernel em nível passivo.
Para suportar um ISR de nível passivo para um dispositivo periférico que gera um sinal de solicitação de interrupção acionado por nível, o gestor de interrupções do kernel mascara a interrupção pendente no pino GPIO e, em seguida, agenda o ISR para ser executado em um thread de nível passivo do kernel. O ISR é responsável por limpar a solicitação de interrupção no dispositivo periférico. Depois de o ISR retornar, 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 o atendimento inicial da interrupção e, em seguida, retornar para evitar atrasar os ISRs de nível passivo de outros dispositivos. Normalmente, o driver deve adiar o processamento adicional relacionado a interrupções para o thread de trabalho de interrupção, que é executado com uma prioridade mais baixa do que o ISR.