Freigeben über


Synchronisieren des Zugriffs auf Gerätedaten

In der Regel müssen InterruptService - oder InterruptMessageService-Routinen (ISRs ) eines Treibers den Zugriff auf Treiberdaten und Hardwareressourcen mit anderen Treiberroutinen teilen. Da ISRs in einem Interruptkontext in einem IRQL mit erhöhten Rechten ausgeführt werden und ein System möglicherweise über mehrere Prozessoren verfügt, ist es wichtig, den Zugriff auf freigegebene Daten und Ressourcen zu synchronisieren, damit für jede Routine garantiert werden kann, dass sie vorübergehend exklusiven Zugriff auf diese freigegebenen Informationen ohne Unterbrechung hat.

Das System unterstützt diese Synchronisierung, indem die ISR innerhalb eines kritischen Interruptabschnitts ausgeführt wird. Einem Interrupt sind eine Drehsperre, die Interrupt-Spin-Sperre und IRQL, die Interruptsynchronisierungs-IRQL, zugewiesen. Das System garantiert, dass dieser Code innerhalb des kritischen Abschnitts exklusiven Zugriff auf freigegebene Informationen ausführt, indem die IRQL des Prozessors auf die Interruptsynchronisierung IRQL erhöht und die Interrupt-Spinsperre abgerufen wird, bevor der Code ausgeführt wird. Das System tritt immer in den kritischen Abschnitt des Interrupts ein, bevor seine ISR ausgeführt wird. Verschiedene Interrupts können denselben kritischen Abschnitt gemeinsam nutzen, indem sie ihre Interrupt-Spinsperre und Synchronisierungs-IRQL freigeben.

Treiber können Code implementieren, der im kritischen Abschnitt des Interrupts ausgeführt wird, indem sie eine SynchCritSection-Routine bereitstellen. Wenn der Treiber KeSynchronizeExecution verwendet, um die SynchCritSection-Routine aufzurufen, wechselt das System automatisch in den kritischen Abschnitt für den durch den Interrupt-Parameter angegebenen Interrupt.

Das Auslösen der IRQL des Prozessors auf die Synchronisierungs-IRQL des Interrupts verhindert, dass der aktuelle Prozessor unterbrochen wird, außer durch einen Interrupt mit einer höheren Synchronisierungs-IRQL. Durch das Abrufen einer Drehsperre wird verhindert, dass andere Prozessoren kritischen Abschnittscode ausführen, der dieser Drehsperre zugeordnet ist.

Das System weist die Interrupt-Spinsperre und die Synchronisierungs-IRQL für den Interrupt zu, wenn der Treiber IoConnectInterruptEx aufruft. In den meisten Fällen kann der Treiber dem System erlauben, beide Werte zu bestimmen:

  • Wenn der Treiber die CONNECT_LINE_BASED Version von IoConnectInterruptEx verwendet und eine NULL-Spinsperre angibt, weist das System eine Drehsperre für die Interruptlinie zu. Das System bestimmt auch den Wert für die IRQL-Synchronisierung (Treiber können optional einen höheren Wert angeben).

  • Wenn der Treiber die CONNECT_MESSAGE_BASED Version von IoConnectInterruptEx verwendet und eine NULL-Spinsperre angibt, weist das System für jede Interruptnachricht eine Drehsperre zu. Das System bestimmt auch den Wert der Synchronisierungs-IRQL für jede Nachricht (Treiber können optional einen höheren Wert angeben, der allen Nachrichten gemeinsam ist).

Ein Treiber muss seine eigene Drehsperre nur zuweisen, wenn die CONNECT_FULLY_SPECIFIED Version von IoConnectInterruptEx verwendet wird und mehrere Interruptvektoren vorhanden sind, die denselben kritischen Abschnitt gemeinsam nutzen müssen. Ein Treiber kann mithilfe der SpinLock - und SynchronizeIrql-Member von IO_CONNECT_INTERRUPT_PARAMETERS seine eigene Drehsperre und Synchronisierungs-IRQL angeben. Weitere Informationen finden Sie unter IO_CONNECT_INTERRUPT_PARAMETERS.

Informationen zum Schreiben und Eingeben kritischer Abschnitte finden Sie unter Verwenden kritischer Abschnitte.