Partager via


Synchronisation de l’accès aux données de l’appareil

En règle générale, les routines InterruptService ou InterruptMessageService (ISR) d’un pilote doivent partager l’accès aux données du pilote et aux ressources matérielles avec d’autres routines de pilotes. Étant donné que les ISR s’exécutent dans un contexte d’interruption au niveau d’un IRQL élevé et qu’un système peut avoir plusieurs processeurs, il est important de synchroniser l’accès aux données et aux ressources partagées afin que chaque routine puisse avoir temporairement un accès exclusif à ces informations partagées, sans interruption.

Le système prend en charge cette synchronisation en exécutant l’ISR dans une section critique d’interruption. Une interruption a un verrou de rotation attribué, le verrou de rotation d’interruption et IRQL, l’IRQL de synchronisation d’interruption. Le système garantit que ce code s’exécute dans la section critique un accès exclusif aux informations partagées, en soulevant l’IRQL du processeur à l’IRQL de synchronisation d’interruption et en acquérant le verrou de rotation d’interruption avant d’exécuter le code. Le système entre toujours dans la section critique de l’interruption avant d’exécuter son ISR. Différentes interruptions peuvent partager la même section critique en partageant leur verrouillage de rotation d’interruption et leur IRQL de synchronisation.

Les pilotes peuvent implémenter du code qui s’exécute dans la section critique de l’interruption en fournissant une routine SynchCritSection . Lorsque le pilote utilise KeSynchronizeExecution pour appeler la routine SynchCritSection , le système entre automatiquement dans la section critique pour l’interruption spécifiée par le paramètre Interrupt .

L’activation de l’IRQL du processeur vers l’IRQL de synchronisation de l’interruption empêche l’interruption du processeur actuel, sauf par une interruption avec un IRQL de synchronisation plus élevé. L’acquisition d’un verrou de rotation empêche d’autres processeurs d’exécuter tout code de section critique associé à ce verrou de rotation.

Le système affecte le verrou de rotation d’interruption et la synchronisation IRQL pour l’interruption lorsque le pilote appelle IoConnectInterruptEx. Dans la plupart des cas, le pilote peut permettre au système de déterminer les deux valeurs :

  • Si le pilote utilise la version CONNECT_LINE_BASED d’IoConnectInterruptEx et spécifie un verrou de rotation NULL , le système alloue un verrou de rotation pour la ligne d’interruption. Le système détermine également la valeur de l’IRQL de synchronisation (les pilotes peuvent éventuellement spécifier une valeur supérieure).

  • Si le pilote utilise la version CONNECT_MESSAGE_BASED d’IoConnectInterruptEx et spécifie un verrou de rotation NULL , le système alloue un verrou de rotation pour chaque message d’interruption. Le système détermine également la valeur de la synchronisation IRQL pour chaque message (les pilotes peuvent éventuellement spécifier une valeur supérieure qui sera commune à tous les messages).

Un pilote doit allouer son propre verrou de rotation uniquement lors de l’utilisation de la version CONNECT_FULLY_SPECIFIED d’IoConnectInterruptEx et lorsqu’il a plusieurs vecteurs d’interruption qui doivent partager la même section critique. Un pilote peut spécifier ses propres verrous de rotation et synchronisation IRQL à l’aide des membres SpinLock et SynchronizeIrql de IO_CONNECT_INTERRUPT_PARAMETERS. Pour plus d’informations, consultez IO_CONNECT_INTERRUPT_PARAMETERS.

Pour plus d’informations sur l’écriture et la saisie de sections critiques, consultez Utilisation de sections critiques.