使用中断资源描述符
即插即用 (PnP) 管理器使用两个通道将中断消息分配给设备。 首先,PnP 管理器向驱动程序发送 一个IRP_MN_FILTER_RESOURCE_REQUIREMENTS 请求,其中包含它打算分配给设备的硬件资源列表,包括中断消息。 驱动程序可以修改此列表以更改中断消息数以及一些每条消息设置。 然后,在 PnP 管理器实际分配资源后,它会发送 IRP_MN_START_DEVICE 请求,并提供分配给驱动程序设备的硬件资源(包括中断消息)的完整列表。
IRP_MN_FILTER_RESOURCE_REQUIREMENTS请求提供IO_RESOURCE_DESCRIPTOR结构的列表。 如果设备具有 PCI 2.2 规范中定义的 MSI (消息信号中断) 功能结构,则 PnP 管理器将提供单个中断消息描述符。 如果设备具有 PCI 3.0 规范中定义的 MSI-X 功能结构,则 PnP 管理器为每个中断消息提供一个结构。 中断消息描述 符的类型为 = CmResourceTypeInterrupt , Flags = CM_RESOURCE_INTERRUPT_LATCHED |CM_RESOURCE_INTERRUPT_MESSAGE。 驱动程序还可以通过更改 结构的 u.Interrupt 成员来更改中断相关性等设置。 请注意,在使用 MSI 时,中断都具有相同的相关性,而使用 MSI-X 时,它们可能具有不同的相关性。 有关详细信息,请参阅 中断相关性和优先级。
对于 MSI,如 PCI 2.2 中定义, u.Interrupt.MaximumVector - u.Interrupt.MinimumVector + 1 是为设备分配的中断消息数。 驱动程序可以通过修改 u.Interrupt.MinimumVector 来更改中断消息数。 对于 MSI 中断消息, u.Interrupt.MaximumVector 始终CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN。 若要分配 MessageCount 中断消息,请将 u.Interrupt.MinimumVector 设置为等于CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN - MessageCount + 1。
对于 PCI 3.0 中定义的 MSI-X,驱动程序可以通过在列表中添加或删除条目来更改分配的中断消息数。 请注意,在响应 IRP_MN_START_DEVICE 请求时,不得随后删除以这种方式添加的中断消息资源。 对于 MSI-X,PnP 管理器为每个消息中断提供一个描述符,此描述 符的 u.Interrupt.MinimumVector 和 u.Interrupt.MaximumVector 成员都设置为CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN。
即插即用管理器分配设备的所有硬件资源(包括中断消息)后,会将IRP_MN_START_DEVICE请求发送到驱动程序。 此请求提供两个 CM_PARTIAL_RESOURCE_DESCRIPTOR 结构列表,分别用于原始资源和已翻译的资源。 对于中断消息,PnP 管理器为每个分配的内存地址提供一个结构,类型 = 为CmResourceTypeInterrupt,Flags = CM_RESOURCE_INTERRUPT_LATCHED |CM_RESOURCE_INTERRUPT_MESSAGE。
请注意,使用 MSI 时,驱动程序仅接收一个中断资源描述符,因为所有消息共享相同的地址。 u.MessageInterrupt.Raw 的 MessageCount 成员可用于确定分配的消息数。 使用 MSI-X 时,驱动程序将接收每个中断消息的单独资源描述符。
在 Windows 8 中,操作系统不支持每个设备功能超过 2048 条中断消息的资源请求。 在 Windows 7 和 Windows Vista 中,操作系统不支持每个设备功能超过 910 条中断消息的资源请求。 如果设备驱动程序超出此限制,设备可能无法启动。 若要使驱动程序能够在包含许多逻辑处理器的计算机中运行,驱动程序应避免为每个处理器请求多个中断。
在系统重新平衡中断资源期间,PnP 管理器可能会要求驱动程序从资源要求列表中选择一组首选的备用中断资源。 但是,PnP 管理器不能始终向驱动程序分配驱动程序首选的资源。 因此,驱动程序必须容忍从资源要求列表中分配任何一组备用中断资源,而不会失败。 例如,为设备分配的消息中断数可能少于驱动程序请求的次数。 在最坏的情况下,驱动程序必须准备好仅使用一个基于线路的中断来操作设备。