Freigeben über


Verwenden von Interruptressourcendeskriptoren

Der Plug & Play-Manager (PnP) weist einem Gerät interrupt-Nachrichten mithilfe von zwei Durchläufen zu. Zunächst sendet der PnP-Manager eine IRP_MN_FILTER_RESOURCE_REQUIREMENTS-Anforderung an den Treiber mit einer Liste von Hardwareressourcen, einschließlich Interruptnachrichten, die er dem Gerät zuweisen möchte. Der Treiber kann diese Liste ändern, um die Anzahl der Interruptnachrichten sowie einige Einstellungen pro Nachricht zu ändern. Nachdem der PnP-Manager die Ressourcen tatsächlich zugewiesen hat, sendet er eine IRP_MN_START_DEVICE Anforderung und stellt eine vollständige Liste der Hardwareressourcen einschließlich Unterbrechungsmeldungen bereit, die dem Gerät des Treibers zugewiesen sind.

Die IRP_MN_FILTER_RESOURCE_REQUIREMENTS-Anforderung stellt eine Liste der IO_RESOURCE_DESCRIPTOR-Strukturen bereit. Wenn das Gerät über eine MSI-Funktionsstruktur (Message-Signaled Interrupt) verfügt, wie in der PCI 2.2-Spezifikation definiert, stellt der PnP-Manager einen einzelnen Interruptnachrichtendeskriptor bereit. Wenn das Gerät über eine MSI-X-Funktionsstruktur verfügt, wie in der PCI 3.0-Spezifikation definiert, stellt der PnP-Manager eine Struktur für jede Interruptnachricht bereit. Interrupt-Nachrichtendeskriptoren weisen den Typ = CmResourceTypeInterrupt und Flags = CM_RESOURCE_INTERRUPT_LATCHED | CM_RESOURCE_INTERRUPT_MESSAGE. Treiber können auch Einstellungen wie die Interruptaffinität ändern, indem sie die u.Interrupt-Member der -Struktur ändern. Beachten Sie, dass bei Verwendung von MSI-Unterbrechungen alle dieselbe Affinität haben, während sie bei Verwendung von MSI-X unterschiedliche Affinitäten aufweisen können. Weitere Informationen finden Sie unter Interrupt Affinity and Priority.For more information, see Interrupt Affinity and Priority.

Für MSI, wie in PCI 2.2 definiert, ist u.Interrupt.MaximumVector - u.Interrupt.MinimumVector + 1 die Anzahl der Interruptnachrichten, die dem Gerät zugeordnet sind. Treiber können die Anzahl von Interruptmeldungen ändern, indem sie u.Interrupt.MinimumVector ändern. Bei MSI-Interruptnachrichten ist u.Interrupt.MaximumVector immer CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN. Um MessageCount-Interruptnachrichten zuzuordnen, legen Sie u.Interrupt.MinimumVector auf gleich CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN - MessageCount + 1 fest.

Für MSI-X, wie in PCI 3.0 definiert, können Treiber die Anzahl der zugeordneten Interruptnachrichten ändern, indem sie Einträge aus der Liste hinzufügen oder entfernen. Beachten Sie, dass auf diese Weise hinzugefügte Interruptnachrichtenressourcen nicht später als Reaktion auf die IRP_MN_START_DEVICE-Anforderung entfernt werden dürfen. Für MSI-X stellt der PnP-Manager einen Deskriptor pro Nachrichtenunterbrechung bereit, und die Member u.Interrupt.MinimumVector und u.Interrupt.MaximumVector dieses Deskriptors sind beide auf CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN festgelegt.

Nachdem der Plug & Play-Manager alle Hardwareressourcen für das Gerät zugewiesen hat, einschließlich Unterbrechungsmeldungen, sendet er die IRP_MN_START_DEVICE-Anforderung an den Treiber. Diese Anforderung stellt zwei Listen von CM_PARTIAL_RESOURCE_DESCRIPTOR-Strukturen bereit, jeweils eine für unformatierte und übersetzte Ressourcen. Für Interruptnachrichten stellt der PnP-Manager eine Struktur für jede zugeordnete Speicheradresse mit Typ = CmResourceTypeInterrupt und Flags = CM_RESOURCE_INTERRUPT_LATCHED | CM_RESOURCE_INTERRUPT_MESSAGE.

Beachten Sie, dass der Treiber bei Verwendung von MSI nur einen Interrupt-Ressourcendeskriptor empfängt, da alle Nachrichten dieselbe Adresse verwenden. Das MessageCount-Element von u.MessageInterrupt.Raw kann verwendet werden, um die Anzahl der zugewiesenen Nachrichten zu bestimmen. Bei Verwendung von MSI-X erhält der Treiber für jede Interruptnachricht einen separaten Ressourcendeskriptor.

In Windows 8 unterstützt das Betriebssystem keine Ressourcenanforderungen für mehr als 2048 Interruptnachrichten pro Gerätefunktion. Unter Windows 7 und Windows Vista unterstützt das Betriebssystem keine Ressourcenanforderungen für mehr als 910 Interruptnachrichten pro Gerätefunktion. Wenn der Gerätetreiber diesen Grenzwert überschreitet, kann das Gerät möglicherweise nicht gestartet werden. Damit ein Treiber auf einem Computer arbeiten kann, der viele logische Prozessoren enthält, sollte der Treiber vermeiden, mehr als einen Interrupt pro Prozessor anzufordern.

Während des Systemausgleichs von Interruptressourcen fordert der PnP-Manager möglicherweise einen Treiber auf, einen bevorzugten Satz alternativer Interruptressourcen aus einer Ressourcenanforderungsliste auszuwählen. Der PnP-Manager kann einem Treiber jedoch nicht immer die vom Treiber bevorzugten Ressourcen zuweisen. Der Treiber muss daher die Zuweisung eines beliebigen Satzes alternativer Interruptressourcen aus der Ressourcenanforderungsliste ohne Fehler tolerieren. Beispielsweise kann dem Gerät eine geringere Anzahl von Nachrichtenunterbrechungen zugewiesen werden als der angeforderte Treiber. Im schlimmsten Fall muss der Treiber bereit sein, das Gerät mit nur einem leitungsbasierten Interrupt zu betreiben.