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 而不是一个大型请求。 此方法可节省连续内存。
驱动程序通常会在响应 PnP IRP_MN_START_DEVICE 请求期间,将 AllocateCommonBuffer 作为设备启动的一部分调用。 启动后,只有一页请求才会成功(如果有)。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | 从 Windows 2000 开始可用。 |
目标平台 | 桌面 |
标头 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
IRQL | PASSIVE_LEVEL |
DDI 符合性规则 | IrqlDispatch(wdm) |