Introduction aux routines SynchCritSection
Les sections critiques sont des sections de code qui nécessitent un accès exclusif aux ressources matérielles ou aux données de pilote. Autrement dit, le code ne doit pas être interrompu par un autre code qui peut référencer les mêmes ressources ou données, et les ressources ou données ne doivent pas être référencées par plusieurs processeurs à la fois.
Les sections critiques doivent être limitées aux routines ISR et SynchCritSection . Le système appelle ces routines uniquement après avoir élevé l’IRQL du processeur actuel sur la valeur DIRQL de l’appareil et acquis un verrou de rotation. Après le retour d’une routine SynchCritSection , le système libère le verrou de rotation et abaisse l’IRQL du processeur.
L’élévation de la valeur IRQL du processeur à la valeur DIRQL de l’appareil empêche l’interruption du processeur actuel, sauf par un appareil de priorité plus élevée. 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. (Ce verrou de rotation est parfois appelé verrou de rotation d’interruption.)
Les routines StartIo et DpcForIsr ou CustomDpc d’un pilote de périphérique doivent fréquemment accéder à certaines des mêmes ressources matérielles (telles que les registres de périphériques ou toute autre mémoire relative du bus) ou aux données gérées par le pilote que l’ISR du pilote. Selon l’appareil ou la conception du pilote, ses routines dispatch, AdapterControl, ControllerControl ou minuteur peuvent également accéder aux ressources matérielles ou aux données gérées par le pilote.
Pour appeler une section non critique isr, un pilote doit utiliser la routine KeSynchronizeExecution . Cette routine accepte l’adresse d’une routine SynchCritSection comme entrée, ainsi que les informations de contexte définies par le pilote et un pointeur d’objet d’interruption. Le système utilise le pointeur d’objet d’interruption pour déterminer le DIRQL et le verrou de rotation à utiliser avec la routine SynchCritSection . (Le pilote a précédemment fourni ces valeurs, à l’aide des paramètres SpinLock et SynchronizeIrql de la fonction IoConnectInterrupt.)