Message-Signaled中斷簡介

在 PCI 2.2 規格中引進了訊息訊號中斷, (MSI) ,作為行型中斷的替代方案。 不使用專用針腳來觸發中斷,使用 MSIS 的裝置會藉由將值寫入特定記憶體位址來觸發中斷。 PCI 3.0 定義稱為 MSI-X的擴充形式,以提升可程式設計性。 Windows Vista 和更新版本的 Windows 支援 MSI 和 MSI-X。 單一裝置可以同時支援 MSI 和 MSI-X。 針對這類裝置,作業系統會自動使用 MSI-X。

中斷訊息是裝置寫入特定位址以觸發中斷的特定值。 不同于以行為基礎的中斷,訊息訊號中斷具有邊緣語意。 裝置會傳送訊息,但不會收到任何收到中斷的硬體通知。

針對 PCI 2.2,訊息是由位址和部分不透明 16 位值所組成。 每個裝置都會獲指派單一位址。 若要傳送多個訊息,裝置可以使用較低的 4 位訊息值來區分訊息。 因此,針對 PCI 2.2,裝置最多可以支援 16 則訊息。

針對 PCI 3.0,訊息是由位址和不透明 32 位值所組成。 每個不同的訊息都有自己的唯一位址。 不同于 PCI 2.2,裝置不會修改值。 針對 PCI 3.0,裝置最多可支援 2,048 個不同的訊息。 支援 PCI 3.0 MSI-X 的裝置具有可動態程式化的硬體資料表,其中包含裝置中每個中斷來源的專案。 此表格中的每個專案都可以使用其中一個配置給裝置的訊息進行程式設計,而且可以獨立遮罩。 驅動程式可以將中斷訊息的程式設計變更為資料表專案,以及專案是否已遮罩。 如需詳細資訊,請參閱 動態設定 MSI-X

驅動程式可以註冊單一 InterruptMessageService 常式,以處理每個訊息的所有可能訊息或個別 的 InterruptService 常式。

驅動程式可以處理裝置傳送的 MSI,如下所示:

  1. 在驅動程式安裝期間,請在登錄中啟用 MSI。 您也可以使用登錄來指定要為裝置配置的訊息數目。 如需詳細資訊,請參閱 在登錄中啟用Message-Signaled中斷

  2. 您可以選擇性地增加中斷訊息的數目,並藉由回應 IRP_MN_FILTER_RESOURCE_REQUIREMENTS 要求來儲存一些個別訊息設定。 如需詳細資訊,請參閱 使用中斷資源描述元

  3. 驅動程式的IRP_MN_START_DEVICE分派常式中,呼叫 IoConnectInterruptEx 來註冊 InterruptServiceInterruptMessageService 常式來服務裝置的中斷。 使用IoConnectInterruptEx的CONNECT_FULLY_SPECIFIED版本來針對特定訊息或IoConnectInterruptEx的 CONNECT_MESSAGE_BASED 版本註冊單一InterruptMessageService常式,以註冊所有訊息的單一 InterruptMessageService 常式。 如需詳細資訊,請參閱 使用 ioConnectInterruptEx CONNECT_MESSAGE_BASED 版使用 ioConnectInterruptEx CONNECT_FULLY_SPECIFIED 版本

  4. 在驅動程式不再想要從裝置服務中斷之後,請在停用裝置的中斷) 之後呼叫 IoDisconnectInterruptEx (,以移除任何已註冊的插斷服務常式。

設計為使用多個訊息的驅動程式應該檢查是否已配置預期的訊息數目。 如果 隨插即用 (PnP) 管理員無法配置要求的訊息數目,則會改為將一則訊息配置給裝置。 驅動程式可以透過下列其中一種方式來檢查實際配置的訊息數目:

  • PnP 管理員會在原始資源描述元清單中報告已配置的訊息數目。 如需詳細資訊,請參閱 使用中斷資源描述元

  • 當 IoConnectInterruptEx傳回時,它會將Parameters-MessageBased.ConnectCoNtext.InterruptMessageTable-MessageCount >>設定為已配置的訊息數目。