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.
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) |