PALLOCATE_COMMON_BUFFER fonction de rappel (wdm.h)
La routine AllocateCommonBuffer 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 master 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 d’UC appropriés, ce qui peut mettre en cache cette mémoire. Si votre pilote doit désactiver la mise en cache, appelez Plutôt AllocateCommonBufferEx .
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 afin de déterminer si l’appareil est cohérent dans le cache.
Valeur retournée
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 peut être appelée uniquement par le pointeur à partir de l’adresse retournée dans une structure de 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 continu via la mémoire système, comme dans une structure de contrôle pour un appareil DMA master bus.
AllocateCommonBuffer prend également en charge les appareils subordonnés dont les pilotes utilisent le mode d’ininitialisation automatique d’un contrôleur DMA système.
AllocateCommonBuffer effectue les opérations suivantes :
- Alloue la mémoire accessible à partir du processeur et de l’appareil. Cette mémoire apparaît contiguë à l’appareil.
- Alloue des registres de carte 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.
Si un pilote a besoin de plusieurs pages d’espace tampon commun, mais que les pages n’ont pas besoin d’être contiguës, le pilote doit effectuer plusieurs demandes d’une page à 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.
Configuration requise
Condition requise | Valeur |
---|---|
Client minimal pris en charge | Disponible à partir de Windows 2000. |
Plateforme cible | Desktop (Expérience utilisateur) |
En-tête | wdm.h (inclure Wdm.h, Ntddk.h, Ntifs.h) |
IRQL | PASSIVE_LEVEL |
Règles de conformité DDI | IrqlDispatch(wdm) |