消息信号中断简介

PCI 2.2 规范中引入了 (MSI) 的消息信号中断,作为基于线路的中断的替代方法。 使用 MSI 的设备通过将值写入特定内存地址来触发中断,而不是使用专用引脚触发中断。 PCI 3.0 定义了一种扩展形式的 MSI,称为 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 版本为特定消息注册 InterruptService 例程,或使用 ioConnectInterruptEx 的 CONNECT_MESSAGE_BASED 版本为所有消息注册单个 InterruptMessageService 例程。 有关详细信息,请参阅 使用 ioConnectInterruptEx 的 CONNECT_MESSAGE_BASED 版本 和使用 IoConnectInterruptEx 的 CONNECT_FULLY_SPECIFIED版本

  4. 驱动程序不再打算处理来自设备的中断后,请在禁用设备的中断后调用 IoDisconnectInterruptEx (,) 删除任何已注册的中断服务例程。

设计为使用多个消息的驱动程序应检查分配预期的消息数。 如果即插即用 (PnP) 管理器无法分配请求的消息数,它会只向设备分配一条消息。 驱动程序可以通过以下方式之一检查实际分配的消息数:

  • PnP 管理器在其原始资源描述符列表中报告分配的消息数。 有关详细信息,请参阅 使用中断资源描述符

  • IoConnectInterruptEx 返回时,它将 Parameters-MessageBased.ConnectContext.InterruptMessageTable-MessageCount>> 设置为分配的消息数。