Partager via


Présentation des interruptions de Message-Signaled

Les interruptions signalées par message ont été introduites dans la spécification PCI 2.2 comme alternative aux interruptions basées sur les lignes. Au lieu d’utiliser un code confidentiel dédié pour déclencher des interruptions, les appareils qui utilisent des MPI déclenchent une interruption en écrivant une valeur dans une adresse mémoire particulière. PCI 3.0 définit une forme étendue de MSI, appelée MSI-X, qui permet une plus grande programmabilité. Windows Vista et les versions ultérieures de Windows prennent en charge MSI et MSI-X. Un seul appareil peut prendre en charge MSI et MSI-X. Pour un tel appareil, le système d’exploitation utilise automatiquement MSI-X.

Un message d’interruption est une valeur particulière qu’un appareil écrit dans une adresse particulière pour déclencher une interruption. Contrairement aux interruptions basées sur les lignes, les interruptions signalées par un message ont une sémantique de bord. L’appareil envoie un message, mais ne reçoit aucun accusé de réception matériel indiquant que l’interruption a été reçue.

Pour PCI 2.2, un message se compose d’une adresse et d’une valeur 16 bits partiellement opaque. Une seule adresse est affectée à chaque appareil. Pour envoyer plusieurs messages, l’appareil peut utiliser les 4 bits inférieurs de la valeur de message pour distinguer les messages. Par conséquent, pour PCI 2.2, les appareils peuvent prendre en charge jusqu’à 16 messages.

Pour PCI 3.0, un message se compose d’une adresse et d’une valeur opaque 32 bits. Chaque message a sa propre adresse unique. Contrairement à PCI 2.2, l’appareil ne modifie pas la valeur. Pour PCI 3.0, un appareil peut prendre en charge jusqu’à 2 048 messages différents. Les appareils qui prennent en charge PCI 3.0 MSI-X disposent d’une table matérielle programmable dynamiquement qui contient des entrées pour chacune des sources d’interruption dans l’appareil. Chaque entrée de ce tableau peut être programmée avec l’un des messages alloués à un appareil et peut être masqué indépendamment. Les pilotes peuvent modifier la programmation d’un message d’interruption dans une entrée de table et déterminer si une entrée a été masquée. Pour plus d’informations, consultez Configuration dynamique de MSI-X.

Les pilotes peuvent inscrire une seule routine InterruptMessageService qui gère tous les messages possibles ou des routines InterruptService individuelles pour chaque message.

Les pilotes peuvent gérer les msis qu’un appareil envoie comme suit :

  1. Lors de l’installation du pilote, activez les INTERFACES de service dans le Registre. Vous pouvez également utiliser le Registre pour spécifier le nombre de messages à allouer à l’appareil. Pour plus d’informations, consultez Activation Message-Signaled interruptions dans le Registre.

  2. Si vous le souhaitez, augmentez le nombre de messages d’interruption et enregistrez certains paramètres par message en répondant à une demande de IRP_MN_FILTER_RESOURCE_REQUIREMENTS . Pour plus d’informations, consultez Utilisation des descripteurs de ressources d’interruption.

  3. Dans la routine de répartition du pilote pour IRP_MN_START_DEVICE, appelez IoConnectInterruptEx pour inscrire une routine InterruptService ou InterruptMessageService afin de traiter les interruptions de l’appareil. Utilisez la version CONNECT_FULLY_SPECIFIED d’IoConnectInterruptEx pour inscrire une routine InterruptService pour un message spécifique ou la version CONNECT_MESSAGE_BASED d’IoConnectInterruptEx pour inscrire une seule routine InterruptMessageService pour tous les messages. Pour plus d’informations, consultez Utilisation de la version CONNECT_MESSAGE_BASED d’IoConnectInterruptEx et Utilisation de la version CONNECT_FULLY_SPECIFIED d’IoConnectInterruptEx.

  4. Une fois que le pilote n’a plus l’intention de traiter les interruptions de l’appareil, appelez IoDisconnectInterruptEx (après avoir désactivé les interruptions de l’appareil) pour supprimer toutes les routines de service d’interruption inscrites.

Les pilotes conçus pour utiliser plusieurs messages doivent case activée que le nombre attendu de messages est alloué. Si le gestionnaire Plug-and-Play (PnP) ne peut pas allouer le nombre demandé de messages, il alloue à la place exactement un message à l’appareil. Les pilotes peuvent case activée le nombre de messages réellement alloués de l’une des manières suivantes :

  • Le gestionnaire PnP signale le nombre de messages alloués dans sa liste de descripteurs de ressources brutes. Pour plus d’informations, consultez Utilisation des descripteurs de ressources d’interruption.

  • Lorsque IoConnectInterruptEx est retourné, il définit Parameters-MessageBased.ConnectContext.InterruptMessageTable-MessageCount>> sur le nombre de messages alloués.