Partager via


Utilisation de Packet-Based Bus-Master DMA

Pour utiliser l’assistant DMA basé sur les paquets, les pilotes des appareils DMA master bus appellent la séquence générale suivante de routines de support pendant qu’ils traitent un IRP demandant un transfert DMA :

  • KeFlushIoBuffers juste avant de tenter d’allouer des registres cartographiques à une demande de transfert (pour plus d’informations, consultez Maintenance de la cohérence du cache)

  • AllocateAdapterChannel lorsque le pilote est prêt à programmer l’adaptateur de master bus pour DMA

  • MmGetMdlVirtualAddress pour obtenir un index dans le MDL, requis comme paramètre initial pour MapTransfer, et MapTransfer pour rendre la mémoire physique système qui sauvegarde la mémoire tampon de l’IRP accessible par périphérique

    Notez que tout pilote peut avoir besoin d’effectuer plusieurs opérations de transfert afin de satisfaire l’IRP actuel, comme expliqué dans Fractionnement des demandes de transfert. Les pilotes d’appareils qui ne disposent pas de fonctionnalités de nuage de points/de collecte peuvent appeler MapTransfer une fois par opération de transfert. Les pilotes d’appareils qui disposent de fonctionnalités de diffusion/collecte peuvent appeler MapTransfer plusieurs fois pour configurer chaque opération de transfert. Ces pilotes peuvent également utiliser la prise en charge intégrée des nuages de points/regroupements du système, décrite dans Using Scatter/Gather DMA.

  • FlushAdapterBuffers à la fin de chaque opération de transfert DMA vers/depuis l’appareil cible, afin de déterminer si toutes les données demandées ont été complètement transférées

  • FreeMapRegisters dès que toutes les opérations DMA pour l’IRP actuel sont terminées, car toutes les données demandées ont été complètement transférées ou parce que le pilote doit échouer l’IRP en raison d’une erreur d’E/S de périphérique ou de bus

Le pointeur d’objet adaptateur retourné par IoGetDmaAdapter est un paramètre obligatoire pour AllocateAdapterChannel, MapTransfer, FlushAdapterBuffers et FreeMapRegisters. Notez que dans les versions de Windows NT antérieures à Windows 2000, les appareils master bus pouvaient passer un pointeur d’objet adaptateur NULL à MapTransfer et FlushAdapterBuffers. Dans Windows 2000 et versions ultérieures, les pilotes ne peuvent plus le faire.

KeFlushIoBuffers et MmGetMdlVirtualAddress nécessitent un pointeur vers la MDL sur Irp-MdlAddress>.

Les pilotes individuels appellent cette séquence de routines de support à différents points, selon la façon dont chaque pilote est implémenté pour traiter son appareil. Par exemple, la routine StartIo d’un pilote peut effectuer l’appel à AllocateAdapterChannel, tandis qu’un autre pilote peut effectuer cet appel à partir d’une routine qui supprime les irps d’une file d’attente de périphériques ou d’une file d’attente de périphériques verrouillés créée par le pilote.

Au lieu d’utiliser les routines décrites dans cette section, tout pilote qui utilise l’assistant DMA basé sur les paquets peut utiliser des routines de prise en charge destinées à simplifier la diffusion/collecte DMA, que son appareil dispose ou non d’une prise en charge intégrée des points/regroupements. Pour plus d’informations, consultez Using Scatter/Gather DMA .