PALLOCATE_COMMON_BUFFER回调函数 (wdm.h)

AllocateCommonBuffer 例程分配内存并映射内存,以便可从处理器和设备同时访问内存以供 DMA作。

语法

PALLOCATE_COMMON_BUFFER PallocateCommonBuffer;

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

参数

[in] DmaAdapter

指向 IoGetDmaAdapter 返回的 DMA_ADAPTER 结构的指针,该结构表示总线主适配器或 DMA 控制器。

[in] Length

指定要分配的内存字节数。

[out] LogicalAddress

指向接收设备可用于访问分配缓冲区的逻辑地址的变量的指针。 使用此地址,而不是调用 MmGetPhysicalAddress,因为系统可以考虑任何特定于平台的内存限制。

[in] CacheEnabled

指定是否可以缓存分配的内存。

忽略此参数。 作系统确定是否在要分配的公用缓冲区中启用缓存内存。 该决策基于处理器体系结构和设备总线。

在具有基于 x86、基于 x64 和基于 Itanium 的处理器的计算机上,将启用缓存内存。 假设设备执行的所有 DMA作都与相关的 CPU 缓存保持一致,这可能缓存该内存。 如果驱动程序需要禁用缓存,请改为调用 AllocateCommonBufferEx

在具有基于 ARM 或 ARM 64 处理器的计算机上,作系统不会为所有设备自动启用缓存内存。 系统依赖于每个设备的 ACPI_CCA 方法来确定设备是否是缓存一致的。

返回值

AllocateCommonBuffer 返回分配范围的基虚拟地址。 如果无法分配缓冲区,它将返回 NULL

言论

AllocateCommonBuffer 不是可以直接按名称调用的系统例程。 此例程只能通过从 DMA_OPERATIONS 结构中返回的地址的指针进行调用。 驱动程序通过调用 IoGetDmaAdapter获取此例程的地址。

AllocateCommonBuffer 支持设备与处理器持续通过系统内存进行通信的 DMA,就像在总线主 DMA 设备的控制结构中一样。

AllocateCommonBuffer 还支持其驱动程序使用系统 DMA 控制器的自动初始化模式的从属设备。

AllocateCommonBuffer 执行以下作:

  • 分配可从处理器和设备访问的内存。 此内存与设备相邻。
  • 分配映射寄存器以映射缓冲区(如果系统需要)。
  • 为设备设置翻译,包括在必要时加载地图寄存器。
若要在经济上使用驻留系统内存,驱动程序应尽可能少地为每个设备分配这些缓冲区。 AllocateCommonBuffer 分配至少一页内存,而不考虑请求的 长度。 成功分配请求的字节数少于PAGE_SIZE字节后,调用方只能访问请求的 长度。 成功分配请求超过整数倍数的PAGE_SIZE字节后,最后一个分配页上的任何剩余字节都无法访问调用方。

如果驱动程序需要多个公共缓冲区空间页,但页面不需要连续,驱动程序应发出多个单页请求来 AllocateCommonBuffer 而不是一个大型请求。 此方法可节省连续内存。

驱动程序通常会在响应 PnP IRP_MN_START_DEVICE 请求期间,将 AllocateCommonBuffer 作为设备启动的一部分调用。 启动后,只有一页请求才会成功(如果有)。

要求

要求 价值
最低支持的客户端 从 Windows 2000 开始可用。
目标平台 桌面
标头 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
IRQL PASSIVE_LEVEL
DDI 符合性规则 IrqlDispatch(wdm)

另请参阅

DMA_ADAPTER

DMA_OPERATIONS

FreeCommonBuffer

IoGetDmaAdapter