Uso de descriptores de recursos de interrupción
El administrador de Plug and Play (PnP) asigna mensajes de interrupción a un dispositivo mediante dos pases. En primer lugar, el administrador de PnP envía una solicitud de IRP_MN_FILTER_RESOURCE_REQUIREMENTS al controlador con una lista de recursos de hardware, incluidos los mensajes de interrupción, que pretende asignar al dispositivo. El controlador puede modificar esta lista para cambiar el número de mensajes de interrupción, así como algunas configuraciones por mensaje. A continuación, después de que el administrador de PnP asigne realmente los recursos, envía una solicitud de IRP_MN_START_DEVICE y proporciona una lista completa de los recursos de hardware, incluidos los mensajes de interrupción, asignados al dispositivo del controlador.
La solicitud IRP_MN_FILTER_RESOURCE_REQUIREMENTS proporciona una lista de estructuras de IO_RESOURCE_DESCRIPTOR . Si el dispositivo tiene una estructura de funcionalidad MSI (interrupción señalada por mensajes) tal como se define en la especificación PCI 2.2, el administrador PnP proporciona un único descriptor de mensaje de interrupción. Si el dispositivo tiene una estructura de funcionalidad MSI-X como se define en la especificación PCI 3.0, el administrador PnP proporciona una estructura para cada mensaje de interrupción. Los descriptores de mensaje de interrupción tienen tipo = CmResourceTypeInterrupt y Flags = CM_RESOURCE_INTERRUPT_LATCHED | CM_RESOURCE_INTERRUPT_MESSAGE. Los controladores también pueden cambiar la configuración, como la afinidad de interrupción, cambiando los miembros u.Interrupt de la estructura. Tenga en cuenta que al usar MSI, las interrupciones tienen la misma afinidad, mientras que al usar MSI-X pueden tener afinidades diferentes. Para obtener más información, consulte Afinidad de interrupción y Prioridad.
Para MSI, tal y como se define en PCI 2.2, u.Interrupt.MaximumVector - u.Interrupt.MinimumVector + 1 es el número de mensajes de interrupción asignados para el dispositivo. Los controladores pueden cambiar el número de mensajes de interrupción modificando u.Interrupt.MinimumVector. En el caso de los mensajes de interrupción msi, u.Interrupt.MaximumVector siempre se CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN. Para asignar mensajes de interrupción de MessageCount , establezca u.Interrupt.MinimumVector en igual a CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN - MessageCount + 1.
Para MSI-X, tal como se define en PCI 3.0, los controladores pueden cambiar el número de mensajes de interrupción asignados agregando o quitando entradas de la lista. Tenga en cuenta que los recursos del mensaje de interrupción agregados de esta manera no se deben quitar posteriormente en respuesta a la solicitud de IRP_MN_START_DEVICE . Para MSI-X, el administrador de PnP proporciona un descriptor por interrupción de mensaje y los miembros u.Interrupt.MinimumVector y u.Interrupt.MaximumVector de este descriptor se establecen en CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN.
Una vez que el administrador de Plug and Play ha asignado todos los recursos de hardware para el dispositivo, incluidos los mensajes de interrupción, envía la solicitud de IRP_MN_START_DEVICE al controlador. Esta solicitud proporciona dos listas de estructuras de CM_PARTIAL_RESOURCE_DESCRIPTOR , una para los recursos sin procesar y traducidos. Para los mensajes de interrupción, el administrador de PnP proporciona una estructura para cada dirección de memoria asignada con tipo = CmResourceTypeInterrupt y Flags = CM_RESOURCE_INTERRUPT_LATCHED | CM_RESOURCE_INTERRUPT_MESSAGE.
Tenga en cuenta que al usar MSI, el controlador solo recibe un descriptor de recursos de interrupción, ya que todos los mensajes comparten la misma dirección. El miembro MessageCount de u.MessageInterrupt.Raw se puede usar para determinar el número de mensajes asignados. Cuando se usa MSI-X, el controlador recibe un descriptor de recursos independiente para cada mensaje de interrupción.
En Windows 8, el sistema operativo no admite solicitudes de recursos para más de 2048 mensajes de interrupción por función del dispositivo. En Windows 7 y Windows Vista, el sistema operativo no admite solicitudes de recursos para más de 910 mensajes de interrupción por función del dispositivo. Si el controlador de dispositivo supera este límite, es posible que el dispositivo no se inicie. Para permitir que un controlador funcione en un equipo que contenga muchos procesadores lógicos, el controlador debe evitar solicitar más de una interrupción por procesador.
Durante el reequilibrio del sistema de recursos de interrupción, el administrador de PnP podría pedir a un controlador que seleccione un conjunto preferido de recursos de interrupción alternativos en una lista de requisitos de recursos. Sin embargo, el administrador de PnP no siempre puede asignar a un controlador los recursos que prefiera el controlador. Por lo tanto, el controlador debe tolerar, sin errores, la asignación de cualquier conjunto de recursos de interrupción alternativos de la lista de requisitos de recursos. Por ejemplo, el dispositivo podría tener asignado un número menor de interrupciones de mensaje que el controlador solicitado. En el peor de los casos, el controlador debe estar preparado para operar el dispositivo con una sola interrupción basada en línea.