Utilisation de Common-Buffer Bus-Master DMA
Comme décrit dans Utilisation d'Bus-Master DMA, certains pilotes pour les appareils DMA master bus utilisent exclusivement la mémoire DMA à mémoire tampon commune, tandis que d’autres utilisent DMA à mémoire tampon commune en combinaison avec DMA basée sur les paquets.
Utilisez l’assistant DMA de mémoire tampon commune de manière économique. La configuration d’une mémoire tampon commune peut lier une partie (ou la totalité, selon la taille de la mémoire tampon demandée) des registres de carte associés à l’objet adaptateur qui représente l’adaptateur master bus.
La configuration économique des zones de mémoire tampon commune, par exemple en utilisant des blocs PAGE_SIZE ou une allocation unique, laisse davantage de registres cartographiques disponibles pour les opérations DMA basées sur les paquets. Il laisse également plus de mémoire système libre à d’autres fins, ce qui produit de meilleures performances globales du pilote et du système.
Pour configurer une mémoire tampon commune pour le bus master DMA, un pilote de périphérique DMA master bus doit appeler AllocateCommonBuffer avec le pointeur d’objet adaptateur retourné par IoGetDmaAdapter. En règle générale, un pilote effectue cet appel à partir de sa routine DispatchPnP pour les requêtes IRP_MN_START_DEVICE . Un pilote doit allouer une mémoire tampon commune uniquement s’il utilise la mémoire tampon à plusieurs reprises pour ses opérations DMA pendant que le pilote reste chargé. Le diagramme suivant illustre un tel appel à AllocateCommonBuffer.
La taille demandée pour la mémoire tampon, indiquée dans le diagramme précédent en tant que LengthForBuffer, détermine le nombre de registres de carte qui doivent être utilisés pour fournir un mappage virtuel-à-logique pour la mémoire tampon commune. Utilisez la macro BYTES_TO_PAGES pour déterminer le nombre maximal de pages nécessaires (BYTES_TO_PAGES (LengthForBuffer)). Cette valeur ne peut pas être supérieure à la valeur NumberOfMapRegisters retournée par IoGetDmaAdapter.
En outre, l’appelant doit fournir les éléments suivants :
Valeur booléenne qui indique si la mise en cache doit être activée
Note Cette valeur est ignorée. Le système d’exploitation détermine s’il faut activer la mémoire mise en cache dans la mémoire tampon commune qui doit être allouée. Cette décision est basée sur l’architecture du processeur et le bus d’appareil.
Sur les ordinateurs équipés de processeurs x86, x64 et Itanium, la mémoire mise en cache est activée.
Sur les ordinateurs équipés de processeurs Arm ou Arm 64, le système d’exploitation n’active pas automatiquement la mémoire mise en cache pour tous les appareils. Le système s’appuie sur la méthode ACPI_CCA pour chaque appareil afin de déterminer si l’appareil est cohérent dans le cache.
Pointeur vers une variable définie par le pilote qui contiendra l’adresse logique de base accessible par le périphérique pour la mémoire tampon (BufferLogicalAddress dans le diagramme précédent) au retour d’AllocateCommonBufferffer
Si l’appel réussit, AllocateCommonBuffer retourne une adresse virtuelle de base accessible par le pilote pour la mémoire tampon (BufferVirtualAddress dans le diagramme précédent), que le pilote doit enregistrer dans son extension de périphérique, extension de contrôleur ou autre zone de stockage résident accessible au pilote (pool non paginé alloué par le pilote).
AllocateCommonBuffer retourne NULL s’il ne peut pas allouer de mémoire pour la mémoire tampon. Si l’adresse virtuelle de base retournée est NULL, le pilote doit utiliser exclusivement la prise en charge DMA basée sur les paquets du système ou le pilote doit échouer à la demande de IRP_MN_START_DEVICE , retournant STATUS_INSUFFICIENT_RESOURCES.
Sinon, le pilote peut utiliser la mémoire tampon commune allouée comme zone de stockage accessible par les pilotes et les adaptateurs pour les transferts DMA.
Lorsque le gestionnaire PnP envoie une IRP qui arrête ou supprime le périphérique, le pilote doit appeler FreeCommonBuffer pour libérer chaque mémoire tampon commune qu’il a allouée.