Utilisation des descripteurs de ressources d’interruption
Le gestionnaire Plug-and-Play (PnP) affecte des messages d’interruption à un appareil à l’aide de deux passes. Tout d’abord, le gestionnaire PnP envoie une demande IRP_MN_FILTER_RESOURCE_REQUIREMENTS au pilote avec une liste de ressources matérielles, y compris des messages d’interruption, qu’il a l’intention d’affecter à l’appareil. Le pilote peut modifier cette liste pour modifier le nombre de messages d’interruption, ainsi que certains paramètres par message. Ensuite, une fois que le gestionnaire PnP a effectivement affecté les ressources, il envoie une demande de IRP_MN_START_DEVICE et fournit une liste complète des ressources matérielles, y compris les messages d’interruption, attribuées à l’appareil du pilote.
La demande IRP_MN_FILTER_RESOURCE_REQUIREMENTS fournit une liste de structures IO_RESOURCE_DESCRIPTOR . Si l’appareil a une structure de capacité MSI (message-signaled interrupt) telle que définie dans la spécification PCI 2.2, le gestionnaire PnP fournit un descripteur de message d’interruption unique. Si l’appareil a une structure de capacité MSI-X telle que définie dans la spécification PCI 3.0, le gestionnaire PnP fournit une structure pour chaque message d’interruption. Les descripteurs de message d’interruption ont type = CmResourceTypeInterrupt et flags = CM_RESOURCE_INTERRUPT_LATCHED | CM_RESOURCE_INTERRUPT_MESSAGE. Les pilotes peuvent également modifier des paramètres tels que l’affinité d’interruption en modifiant les membres u.Interrupt de la structure. Notez que lors de l’utilisation de MSI, les interruptions ont toutes la même affinité, tandis que lors de l’utilisation de MSI-X, elles peuvent avoir des affinités différentes. Pour plus d’informations, consultez Interrompre l’affinité et la priorité.
Pour MSI, comme défini dans PCI 2.2, u.Interrupt.MaximumVector - u.Interrupt.MinimumVector + 1 est le nombre de messages d’interruption alloués pour l’appareil. Les pilotes peuvent modifier le nombre de messages d’interruption en modifiant u.Interrupt.MinimumVector. Pour les messages d’interruption MSI, u.Interrupt.MaximumVector est toujours CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN. Pour allouer des messages d’interruption MessageCount , définissez u.Interrupt.MinimumVector sur égal à CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN - MessageCount + 1.
Pour MSI-X, tel que défini dans PCI 3.0, les pilotes peuvent modifier le nombre de messages d’interruption alloués en ajoutant ou en supprimant des entrées de la liste. Notez que les ressources de message d’interruption ajoutées de cette façon ne doivent pas être supprimées par la suite en réponse à la demande IRP_MN_START_DEVICE . Pour MSI-X, le gestionnaire PnP fournit un descripteur par interruption de message, et les membres u.Interrupt.MinimumVector et u.Interrupt.MaximumVector de ce descripteur sont tous deux définis sur CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN.
Une fois que le gestionnaire de Plug-and-Play a affecté toutes les ressources matérielles pour l’appareil, y compris les messages d’interruption, il envoie le IRP_MN_START_DEVICE demande au pilote. Cette demande fournit deux listes de structures CM_PARTIAL_RESOURCE_DESCRIPTOR , une pour les ressources brutes et traduites. Pour les messages d’interruption, le gestionnaire PnP fournit une structure pour chaque adresse mémoire allouée avec Type = CmResourceTypeInterrupt et Flags = CM_RESOURCE_INTERRUPT_LATCHED | CM_RESOURCE_INTERRUPT_MESSAGE.
Notez que lors de l’utilisation de MSI, le pilote ne reçoit qu’un seul descripteur de ressource d’interruption, car tous les messages partagent la même adresse. Le membre MessageCount de u.MessageInterrupt.Raw peut être utilisé pour déterminer le nombre de messages attribués. Lors de l’utilisation de MSI-X, le pilote reçoit un descripteur de ressource distinct pour chaque message d’interruption.
Dans Windows 8, le système d’exploitation ne prend pas en charge les demandes de ressources pour plus de 2 048 messages d’interruption par fonction d’appareil. Dans Windows 7 et Windows Vista, le système d’exploitation ne prend pas en charge les demandes de ressources pour plus de 910 messages d’interruption par fonction d’appareil. Si le pilote de périphérique dépasse cette limite, le démarrage de l’appareil peut échouer. Pour permettre à un pilote de fonctionner dans un ordinateur qui contient de nombreux processeurs logiques, le pilote doit éviter de demander plusieurs interruptions par processeur.
Pendant le rééquilibrage système des ressources d’interruption, le gestionnaire PnP peut demander à un pilote de sélectionner un ensemble préféré de ressources d’interruption de remplacement dans une liste de ressources requises. Toutefois, le gestionnaire PnP ne peut pas toujours affecter à un pilote les ressources que le pilote préfère. Le pilote doit donc tolérer, sans défaillances, l’attribution de n’importe quel ensemble de ressources d’interruption de remplacement à partir de la liste des besoins en ressources. Par exemple, l’appareil peut se voir attribuer un nombre d’interruptions de message inférieur à celui du pilote demandé. Dans le pire des cas, le pilote doit être prêt à utiliser l’appareil avec une seule interruption basée sur la ligne.