Einführung in Message-Signaled Interrupts

Message-Signaled Interrupts (MSIs) wurden in der PCI 2.2-Spezifikation als Alternative zu leitungsbasierten Interrupts eingeführt. Anstatt einen dedizierten Pin zum Auslösen von Interrupts zu verwenden, lösen Geräte, die MSIs verwenden, einen Interrupt aus, indem sie einen Wert an eine bestimmte Speicheradresse schreiben. PCI 3.0 definiert eine erweiterte Msi-Form namens MSI-X, die eine bessere Programmierbarkeit ermöglicht. Windows Vista und höhere Versionen von Windows unterstützen MSI und MSI-X. Ein einzelnes Gerät kann sowohl MSI als auch MSI-X unterstützen. Für ein solches Gerät verwendet das Betriebssystem automatisch MSI-X.

Eine Interruptnachricht ist ein bestimmter Wert, den ein Gerät in eine bestimmte Adresse schreibt, um einen Interrupt auszulösen. Im Gegensatz zu zeilenbasierten Interrupts verfügen Nachrichtensignal-Interrupts über Edgesemantik. Das Gerät sendet eine Nachricht, empfängt jedoch keine Hardwarebestätigung, dass der Interrupt empfangen wurde.

Bei PCI 2.2 besteht eine Nachricht aus einer Adresse und einem teilweise undurchsichtigen 16-Bit-Wert. Jedem Gerät wird eine einzelne Adresse zugewiesen. Um mehrere Nachrichten zu senden, kann das Gerät die unteren 4 Bits des Nachrichtenwerts verwenden, um Nachrichten zu unterscheiden. Daher können Geräte für PCI 2.2 bis zu 16 Nachrichten unterstützen.

Bei PCI 3.0 besteht eine Nachricht aus einer Adresse und einem undurchsichtigen 32-Bit-Wert. Jede andere Nachricht verfügt über eine eigene eindeutige Adresse. Im Gegensatz zu PCI 2.2 ändert das Gerät den Wert nicht. Für PCI 3.0 kann ein Gerät bis zu 2.048 verschiedene Nachrichten unterstützen. Geräte, die PCI 3.0 MSI-X unterstützen, verfügen über eine dynamisch programmierbare Hardwaretabelle, die Einträge für die einzelnen Interruptquellen im Gerät enthält. Jeder Eintrag in dieser Tabelle kann mit einer der Nachrichten programmiert werden, die einem Gerät zugeordnet sind, und kann unabhängig maskiert werden. Treiber können die Programmierung einer Interruptnachricht in einen Tabelleneintrag ändern und festlegen, ob ein Eintrag maskiert wurde. Weitere Informationen finden Sie unter Dynamisches Konfigurieren von MSI-X.

Treiber können eine einzelne InterruptMessageService-Routine registrieren, die alle möglichen Nachrichten oder einzelne InterruptService-Routinen für jede Nachricht verarbeitet.

Treiber können MSIs, die ein Gerät sendet, wie folgt behandeln:

  1. Aktivieren Sie während der Treiberinstallation MSIs in der Registrierung. Sie können auch die Registrierung verwenden, um die Anzahl der Nachrichten anzugeben, die dem Gerät zugeordnet werden sollen. Weitere Informationen finden Sie unter Aktivieren Message-Signaled Interrupts in der Registrierung.

  2. Erhöhen Sie optional die Anzahl von Interruptnachrichten, und speichern Sie einige Einstellungen pro Nachricht, indem Sie auf eine IRP_MN_FILTER_RESOURCE_REQUIREMENTS-Anforderung reagieren. Weitere Informationen finden Sie unter Verwenden von Interruptressourcendeskriptoren.

  3. Rufen Sie in der Dispatchroutine des Treibers für IRP_MN_START_DEVICEIoConnectInterruptEx auf, um eine InterruptService - oder InterruptMessageService-Routine zum Verarbeiten der Interrupts des Geräts zu registrieren. Verwenden Sie die CONNECT_FULLY_SPECIFIED Version von IoConnectInterruptEx , um eine InterruptService-Routine für eine bestimmte Nachricht oder die CONNECT_MESSAGE_BASED Version von IoConnectInterruptEx zu registrieren, um eine einzelne InterruptMessageService-Routine für alle Nachrichten zu registrieren. Weitere Informationen finden Sie unter Verwenden der CONNECT_MESSAGE_BASED Version von IoConnectInterruptEx und Verwenden der CONNECT_FULLY_SPECIFIED Version von IoConnectInterruptEx.

  4. Nachdem der Treiber nicht mehr beabsichtigt, Interrupts vom Gerät zu warten, rufen Sie IoDisconnectInterruptEx (nach dem Deaktivieren der Interrupts des Geräts) auf, um alle registrierten Interruptdienstroutinen zu entfernen.

Treiber, die für die Verwendung mehrerer Nachrichten konzipiert sind, sollten überprüfen, ob die erwartete Anzahl von Nachrichten zugeordnet ist. Wenn der Plug & Play-Manager (PnP) die angeforderte Anzahl von Nachrichten nicht zuordnen kann, ordnet er dem Gerät stattdessen genau eine Nachricht zu. Treiber können die Anzahl der Nachrichten, die tatsächlich zugeordnet sind, auf eine der folgenden Arten überprüfen:

  • Der PnP-Manager meldet die Anzahl der zugeordneten Nachrichten in der Liste der Rohressourcendeskriptoren. Weitere Informationen finden Sie unter Verwenden von Interruptressourcendeskriptoren.

  • Wenn IoConnectInterruptEx zurückgibt, wird Parameters-MessageBased.ConnectContext.InterruptMessageTable-MessageCount>> auf die Anzahl der zugeordneten Nachrichten festgelegt.