Passive-Level ISRs
Ab Windows 8 können Treiber des Kernelmodustreiberframeworks (KMDF) und des Benutzermodustreiberframeworks (UMDF) optional ihre Interrupt-Dienstroutinen (ISRs) registrieren, um auf passiver Ebene ausgeführt zu werden.
Weitere Informationen zu ISRs auf passiver Ebene für KMDF- und UMDF-Treiber finden Sie in den folgenden Themen:
Wenn ein Peripheriegerät einen GPIO-Pin (General Purpose E/O) verwendet, um eine Interruptanforderung an den Prozessor weiterzuversetzen, ermöglicht die Windows-Interrupt-Abstraktion dem Treiber für dieses Gerät bequem, die hardwarespezifischen Details des GPIO-Controllers zu ignorieren, zu dem dieser Pin gehört. Wenn der Kernel trap-Handler als Reaktion auf eine GPIO-Relay-Interruptanforderung vom Gerät ausgeführt wird, löscht dieser Handler automatisch den Interrupt in den GPIO-Hardwareregistern. Darüber hinaus ruft der Kernel-Traphandler entweder direkt den ISR des Geräts auf oder plant, dass dieser ISR in einem anderen Thread ausgeführt wird.
Häufig sind GPIO-Hardwareregister speicherseitig zugeordnet. In diesem Fall kann der Kernel-Trap-Handler direkt unter DIRQL auf sie zugreifen. Die Hardwareregister des Peripheriegeräts sind jedoch möglicherweise nicht speicherseitig zugeordnet. In diesem Fall muss der Treiber des Peripheriegeräts E/A-Anforderungen verwenden, um darauf zuzugreifen. In diesem Zusammenhang muss der ISR für den Peripheriegerätetreiber unter IRQL = PASSIVE_LEVEL ausgeführt werden, damit E/A-Anforderungen verwendet werden können, um den Interrupt zu unterbrechen oder die anfängliche Wartung des Interrupts durchzuführen. Ein ISR auf passiver Ebene kann eine E/A-Anforderung synchron senden und bei Bedarf blockieren, bis die Anforderung abgeschlossen ist.
Um einen ISR auf passiver Ebene für ein Peripheriegerät zu unterstützen, das ein vom Edge ausgelöstes Interruptanforderungssignal generiert, löscht der Kernel-Trap-Handler den ausstehenden Interrupt am GPIO-Pin und plant dann die Ausführung des ISR in einem Kernelthread auf passiver Ebene.
Um eine ISR auf passiver Ebene für ein Peripheriegerät zu unterstützen, das ein pegelgesteuertes Interruptanforderungssignal generiert, maskiert der Kernel trap-Handler den ausstehenden Interrupt am GPIO-Pin und plant dann die Ausführung des ISR in einem Kernelthread auf passiver Ebene. Der ISR ist für das Löschen der Interruptanforderung im Peripheriegerät verantwortlich. Nachdem der ISR zurückgegeben wurde, entlarmt der Kernelthread den Interrupt am GPIO-Pin.
Da der Interrupt maskiert bleibt, bis der ISR zurückgibt, sollte der ISR auf passiver Ebene des Geräts nur die anfängliche Wartung des Interrupts ausführen und dann zurückkehren, um zu vermeiden, dass ISRs auf passiver Ebene für andere Geräte verzögert werden. In der Regel sollte der Treiber zusätzliche Interrupt-bezogene Verarbeitung auf den Interrupt-Workerthread zurückstellen, der mit einer niedrigeren Priorität als der ISR ausgeführt wird.