Compartir a través de


Introducción a las interrupciones de Message-Signaled

Las interrupciones señaladas por mensajes (MSIs) se introdujeron en la especificación PCI 2.2 como alternativa a las interrupciones basadas en línea. En lugar de usar un pin dedicado para desencadenar interrupciones, los dispositivos que usan MSIs desencadenan una interrupción escribiendo un valor en una dirección de memoria determinada. PCI 3.0 define una forma extendida de MSI, denominada MSI-X, que permite una mayor programación. Windows Vista y versiones posteriores de Windows admiten MSI y MSI-X. Un único dispositivo puede admitir MSI y MSI-X. Para este tipo de dispositivo, el sistema operativo usará automáticamente MSI-X.

Un mensaje de interrupción es un valor determinado que un dispositivo escribe en una dirección determinada para desencadenar una interrupción. A diferencia de las interrupciones basadas en línea, las interrupciones señaladas por mensajes tienen semántica perimetral. El dispositivo envía un mensaje, pero no recibe ninguna confirmación de hardware de que se recibió la interrupción.

Para PCI 2.2, un mensaje consta de una dirección y un valor de 16 bits parcialmente opaco. A cada dispositivo se le asigna una sola dirección. Para enviar varios mensajes, el dispositivo puede usar los 4 bits inferiores del valor del mensaje para distinguir los mensajes. Por lo tanto, para PCI 2.2, los dispositivos pueden admitir hasta 16 mensajes.

Para PCI 3.0, un mensaje consta de una dirección y un valor opaco de 32 bits. Cada mensaje diferente tiene su propia dirección única. A diferencia de PCI 2.2, el dispositivo no modifica el valor. Para PCI 3.0, un dispositivo puede admitir hasta 2048 mensajes diferentes. Los dispositivos que admiten PCI 3.0 MSI-X cuentan con una tabla de hardware programable dinámicamente que contiene entradas para cada uno de los orígenes de interrupción del dispositivo. Cada entrada de esta tabla se puede programar con uno de los mensajes asignados a un dispositivo y se puede enmascarar de forma independiente. Los controladores pueden cambiar la programación de un mensaje de interrupción en una entrada de tabla y si se ha enmascarado una entrada. Para obtener más información, consulte Configuración dinámica de MSI-X.

Los controladores pueden registrar una única rutina InterruptMessageService que controla todos los mensajes posibles o rutinas de InterruptService individuales para cada mensaje.

Los controladores pueden controlar las MS que envía un dispositivo de la siguiente manera:

  1. Durante la instalación del controlador, habilite las MSIs en el registro. También puede usar el registro para especificar el número de mensajes que se van a asignar para el dispositivo. Para obtener más información, consulte Habilitación de interrupciones Message-Signaled en el Registro.

  2. Opcionalmente, aumente el número de mensajes de interrupción y guarde algunas configuraciones por mensaje respondiendo a una solicitud de IRP_MN_FILTER_RESOURCE_REQUIREMENTS . Para obtener más información, consulte Uso de descriptores de recursos de interrupción.

  3. En la rutina de distribución del controlador para IRP_MN_START_DEVICE, llame a IoConnectInterruptEx para registrar una rutina InterruptService o InterruptMessageService para atender las interrupciones del dispositivo. Use la versión CONNECT_FULLY_SPECIFIED de IoConnectInterruptEx para registrar una rutina InterruptService para un mensaje específico o la versión CONNECT_MESSAGE_BASED de IoConnectInterruptEx para registrar una única rutina InterruptMessageService para todos los mensajes. Para obtener más información, consulte Uso de la versión CONNECT_MESSAGE_BASED de IoConnectInterruptEx y Uso de la versión CONNECT_FULLY_SPECIFIED de IoConnectInterruptEx.

  4. Después de que el controlador ya no tenga intención de atender las interrupciones del dispositivo, llame a IoDisconnectInterruptEx (después de deshabilitar las interrupciones del dispositivo) para quitar las rutinas de servicio de interrupción registradas.

Los controladores diseñados para usar varios mensajes deben comprobar que se asigna el número esperado de mensajes. Si el administrador de Plug and Play (PnP) no puede asignar el número solicitado de mensajes, en su lugar asigna exactamente un mensaje al dispositivo. Los controladores pueden comprobar el número de mensajes que se asignan realmente de una de las maneras siguientes:

  • El administrador de PnP informa del número de mensajes asignados en su lista de descriptores de recursos sin procesar. Para obtener más información, consulte Uso de descriptores de recursos de interrupción.

  • Cuando Se devuelve IoConnectInterruptEx, establece Parameters-MessageBased.ConnectContext.InterruptMessageTable-MessageCount>> en el número de mensajes asignados.