Partager via


Utilisation d’un système DMA basé sur des paquets

Les pilotes d’appareils subordonnés qui utilisent un DMA basée sur les paquets appellent la séquence générale suivante de routines de support lors du traitement d’un IRP demandant un transfert DMA :

  • KeFlushIoBuffers juste avant de tenter d’allouer le contrôleur DMA du système (pour en savoir plus, consultez Maintenir la cohérence du cache)

  • AllocateAdapterChannel lorsque le pilote est prêt à programmer son appareil pour DMA et a besoin du contrôleur DMA du système

    AllocateAdapterChannel, appelle à son tour la routine AdapterControl du pilote.

  • MmGetMdlVirtualAddress pour obtenir un index dans le MDL, requis en tant que paramètre dans l’appel initial à MapTransfer

  • MapTransfer pour programmer le contrôleur DMA du système pour l’opération de transfert

    Un pilote peut devoir appeler MapTransfer plusieurs fois pour transférer toutes les données demandées, comme expliqué dans Fractionnement des demandes de transfert.

  • FlushAdapterBuffers juste après chaque opération de transfert DMA vers/depuis l’appareil subordonné

    Si un pilote doit appeler MapTransfer plusieurs fois pour transférer toutes les données demandées, il doit appeler FlushAdapterBuffers autant de fois qu’il appelle MapTransfer.

  • FreeAdapterChannel dès que toutes les données demandées ont été transférées ou si le pilote échoue à l’IRP en raison d’une erreur d’E/S d’appareil

Le pointeur d’objet de l’adaptateur renvoyé par IoGetDmaAdapter est un paramètre requis pour chacune de ces routines, à l’exception de KeFlushIoBuffers et MmGetMdlVirtualAddress, qui nécessitent le pointeur vers le MDL passé à Irp->MdlAddress.

Les pilotes individuels appellent cette séquence de routines de support à différents moments, en fonction de la manière dont chaque pilote est implémenté pour servir son appareil. Par exemple, une routine d’un pilote StartIo peut effectuer l’appel à AllocateAdapterChannel, un autre pilote peut effectuer cet appel à partir d’une routine qui supprime les IRP d’une file d’attente verrouillée créée par un pilote, et un autre pilote peut effectuer cet appel lorsque son appareil DMA subordonné indique qu’il est prêt à transférer des données.