Partager via


Passive-Level ISR

À compter de Windows 8, les pilotes KMDF (Kernel-Mode Driver Framework) et UMDF (User-Mode Driver Framework) peuvent, en option, inscrire leurs routines de service d’interruption (ISR) pour s’exécuter au niveau passif.

Pour plus d’informations sur les ISR de niveau passif pour les pilotes KMDF et UMDF, consultez les rubriques suivantes :

Si un périphérique utilise une broche d’E/S à usage général (GPIO) pour relayer une demande d’interruption au processeur, l’abstraction d’interruption Windows permet facilement au pilote de cet appareil d’ignorer les détails spécifiques au matériel du contrôleur GPIO auquel appartient cette broche. Lorsque le gestionnaire d’interruptions de noyau s’exécute en réponse à une demande d’interruption relayée par GPIO de l’appareil, ce gestionnaire efface ou masque automatiquement, selon les besoins, l’interruption dans les registres matériels GPIO. En outre, le gestionnaire d’interruptions de noyau appelle directement l’ISR de l’appareil ou planifie l’exécution de cet ISR dans un autre thread.

Souvent, les registres matériels GPIO sont mappés en mémoire, auquel cas le gestionnaire d’interruptions de noyau peut y accéder directement au niveau du DIRQL. Toutefois, les registres matériels de l’appareil périphérique peuvent ne pas être mappés à la mémoire, auquel cas, le pilote de périphérique doit utiliser des demandes d’E/S pour y accéder. Si c’est le cas, l’ISR du pilote de périphérique doit s’exécuter à IRQL = PASSIVE_LEVEL afin qu’il puisse utiliser des demandes d’E/S pour réduire l’interruption au silence ou pour effectuer la maintenance initiale de l’interruption. Un ISR de niveau passif peut envoyer une requête d’E/S de manière synchrone et, si nécessaire, bloquer jusqu’à ce que la demande soit terminée.

Pour prendre en charge un ISR de niveau passif pour un périphérique qui génère un signal de demande d’interruption déclenché par le bord, le gestionnaire d’interruption du noyau efface l’interruption en attente au niveau du code PIN GPIO, puis planifie l’exécution de l’ISR dans un thread de noyau passif.

Pour prendre en charge un ISR de niveau passif pour un périphérique qui génère un signal de demande d’interruption déclenché par un niveau, le gestionnaire d’interruptions de noyau masque l’interruption en attente au niveau de la broche GPIO, puis planifie l’exécution de l’ISR dans un thread de noyau passif. L’ISR est responsable de l’effacement de la demande d’interruption dans le périphérique. Une fois l’ISR retourné, le thread de noyau démasque l’interruption au niveau de la broche GPIO.

Étant donné que l’interruption reste masquée jusqu’au retour de l’ISR, l’ISR de niveau passif de l’appareil doit effectuer uniquement la maintenance initiale de l’interruption, puis revenir pour éviter de retarder les ISR de niveau passif pour d’autres appareils. En règle générale, le pilote doit reporter le traitement supplémentaire lié aux interruptions vers le thread de travail d’interruption, qui s’exécute à une priorité inférieure à celle de l’ISR.