Partager via


PALLOCATE_COMMON_BUFFER fonction de rappel (wdm.h)

L'AllocateCommonBuffer routine alloue de la mémoire et la mappe afin qu’elle soit simultanément accessible à partir du processeur et d’un appareil pour les opérations DMA.

Syntaxe

PALLOCATE_COMMON_BUFFER PallocateCommonBuffer;

PVOID PallocateCommonBuffer(
  [in]  PDMA_ADAPTER DmaAdapter,
  [in]  ULONG Length,
  [out] PPHYSICAL_ADDRESS LogicalAddress,
  [in]  BOOLEAN CacheEnabled
)
{...}

Paramètres

[in] DmaAdapter

Pointeur vers la structure DMA_ADAPTER retournée par IoGetDmaAdapter qui représente l’adaptateur maître de bus ou le contrôleur DMA.

[in] Length

Spécifie le nombre d’octets de mémoire à allouer.

[out] LogicalAddress

Pointeur vers une variable qui reçoit l’adresse logique que l’appareil peut utiliser pour accéder à la mémoire tampon allouée. Utilisez cette adresse plutôt que d’appeler MmGetPhysicalAddress, car le système peut prendre en compte toutes les restrictions de mémoire spécifiques à la plateforme.

[in] CacheEnabled

Spécifie si la mémoire allouée peut être mise en cache.

Ce paramètre est ignoré. Le système d’exploitation détermine s’il faut activer la mémoire mise en cache dans la mémoire tampon commune à allouer. Cette décision est basée sur l’architecture du processeur et le bus d’appareil.

Sur les ordinateurs dotés de processeurs x86, x64 et Itanium, la mémoire mise en cache est activée. Il est supposé que toutes les opérations DMA effectuées par un appareil sont cohérentes avec les caches de processeur appropriés, ce qui peut mettre en cache cette mémoire. Si votre pilote doit désactiver la mise en cache, appelez AllocateCommonBufferEx à la place.

Sur les ordinateurs doté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 pour déterminer si l’appareil est cohérent avec le cache.

Valeur de retour

AllocateCommonBuffer retourne l’adresse virtuelle de base de la plage allouée. Si la mémoire tampon ne peut pas être allouée, elle retourne NULL .

Remarques

AllocateCommonBuffer n’est pas une routine système qui peut être appelée directement par nom. Cette routine est appelante uniquement par le pointeur de l’adresse retournée dans une structure DMA_OPERATIONS. Les pilotes obtiennent l’adresse de cette routine en appelant IoGetDmaAdapter.

AllocateCommonBuffer prend en charge DMA dans lequel l’appareil et le processeur communiquent en permanence via la mémoire système, comme dans une structure de contrôle pour un appareil DMA maître de bus.

AllocateCommonBuffer prend également en charge les périphériques subordonnés dont les pilotes utilisent le mode d’autoinitialisation d’un contrôleur DMA système.

AllocateCommonBuffer effectue les opérations suivantes :

  • Alloue de la mémoire accessible à partir du processeur et de l’appareil. Cette mémoire apparaît contiguë à l’appareil.
  • Alloue des registres cartographiques pour mapper la mémoire tampon, si nécessaire par le système.
  • Configure une traduction pour l’appareil, y compris le chargement des registres de carte si nécessaire.
Pour utiliser la mémoire système résidente économiquement, les pilotes doivent allouer autant de ces mémoires tampons que possible par appareil. AllocateCommonBuffer alloue au moins une page de mémoire, quelle que soit la longueur demandée. Après une allocation réussie demandant moins de PAGE_SIZE octets, l’appelant peut accéder uniquement aux longueur demandées. Après une allocation réussie demandant plus qu’un multiple intégral d’PAGE_SIZE octets, tous les octets restants sur la dernière page allouée sont inaccessibles à l’appelant.

Si un pilote a besoin de plusieurs pages d’espace tampon commun, mais que les pages ne doivent pas être contiguës, le pilote doit effectuer plusieurs demandes d’une page pour AllocateCommonBuffer au lieu d’une requête volumineuse. Cette approche conserve la mémoire contiguë.

Les pilotes appellent généralement AllocateCommonBuffer dans le cadre du démarrage de l’appareil, lors de leur réponse à une demande de IRP_MN_START_DEVICE PnP. Après le démarrage, il est possible que seules les demandes d’une page réussissent, le cas échéant.

Exigences

Exigence Valeur
client minimum pris en charge Disponible à partir de Windows 2000.
plateforme cible Bureau
d’en-tête wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
IRQL PASSIVE_LEVEL
règles de conformité DDI irqlDispatch(wdm)

Voir aussi

DMA_ADAPTER

DMA_OPERATIONS

FreeCommonBuffer

IoGetDmaAdapter