PALLOCATE_COMMON_BUFFER_EX回调函数 (wdm.h)
AllocateCommonBufferEx 例程为通用缓冲区分配内存,并映射此内存,以便处理器和执行 DMA作的设备可以访问该内存。
语法
PALLOCATE_COMMON_BUFFER_EX PallocateCommonBufferEx;
PVOID PallocateCommonBufferEx(
[in] PDMA_ADAPTER DmaAdapter,
[in, optional] PPHYSICAL_ADDRESS MaximumAddress,
[in] ULONG Length,
[out] PPHYSICAL_ADDRESS LogicalAddress,
[in] BOOLEAN CacheEnabled,
[in] NODE_REQUIREMENT PreferredNode
)
{...}
参数
[in] DmaAdapter
指向 DMA_ADAPTER 结构的指针。 此结构是表示驱动程序总线主 DMA 设备或系统 DMA 通道的适配器对象。 调用方从对 IoGetDmaAdapter 例程的上一次调用中获取此指针。
[in, optional] MaximumAddress
指向包含公共缓冲区最大逻辑地址的变量的指针。 此参数指示缓冲区应从此地址下面的内存中分配。 此参数是可选的,可以指定为 NULL,以指示没有最大地址。
[in] Length
要为 DMA作分配的公共缓冲区的大小(以字节为单位)。
[out] LogicalAddress
指向此例程写入设备可用于访问公共缓冲区的逻辑地址的变量的指针。 DMA 设备应使用此逻辑地址,而不是例程返回的物理地址,例如 MmGetPhysicalAddress。
[in] CacheEnabled
例程必须启用或禁用要分配的公共缓冲区中的缓存内存。 如果为 TRUE,则启用缓存。 如果为 FALSE,则禁用它。 如果硬件平台不强制实施 DMA作的缓存一致性,则传递 FALSE。 有关基于 ARM 或 ARM 64 处理器的目标计算机的此参数的信息,请参阅“备注”。
[in] PreferredNode
要从中分配内存的首选 NUMA 节点。 如果 N 是多处理器系统中的 NUMA 节点数,则 PreferredNode 是范围 0 到 N–1 中的数字。 对于单处理器系统或非 NUMA 多处理器系统,请将 PreferredNode 设置为零。
返回值
AllocateCommonBufferEx 返回为公共缓冲区分配的内存的虚拟地址。 如果无法分配缓冲区,则返回 NULL。
言论
AllocateCommonBufferEx 不是可以直接按名称调用的系统例程。 只能通过从 DMA_OPERATIONS 结构中返回的地址的指针调用此例程。 驱动程序通过调用 IoGetDmaAdapter,并将 DeviceDescription 参数的版本成员设置为DEVICE_DESCRIPTION_VERSION3来获取此例程的地址。 如果 IoGetDmaAdapter 返回 NULL,则例程在平台上不可用。
AllocateCommonBufferEx 是 AllocateCommonBuffer 例程的扩展版本。 以下列表汇总了仅在扩展版本中可用的功能:
调用方可以为要分配的公共缓冲区指定最大逻辑地址。
调用方可以指定要在其中分配公共缓冲区的首选 NUMA 节点。
在具有基于 ARM 或 ARM 64 处理器的计算机上,系统 ACPI 中的缓存设置的优先级高于驱动程序传递的 CacheEnabled 参数值。 如果 ACPI _CCA 方法指示设备不一致缓存,则作系统将禁用缓存,即使驱动程序使用 CacheEnabled 设置为 TRUE 分配缓存内存也是如此。
在具有基于 ARM 或 ARM 64 处理器的计算机上,作系统将未缓存的公共缓冲区分配为设备内存。 有关缓冲区的详细信息,请参阅 ARMv7 体系结构参考手册中的 A3.5.1 和 A3.5.6 部分。
处理器不允许对设备内存进行不对齐的访问。 驱动程序必须始终使用自然对齐的作从公共缓冲区访问数据。 大多数内核例程不接受设备内存作为输入参数。 例如,网络驱动程序无法将设备内存传递到 NdisMIndicateReceiveNetBufferLists。 如果驱动程序需要将数据从 DMA 公共缓冲区传递到内核例程,请分配 CacheEnabled 设置为 TRUE 的缓冲区,或者将数据从未缓存的公共缓冲区复制到临时池分配中。
有关使用通用缓冲区的 DMA作的详细信息,请参阅以下主题:
使用 Common-Buffer Bus-Master DMA
要求
要求 | 价值 |
---|---|
最低支持的客户端 | 从 Windows 8 开始可用。 |
目标平台 | 桌面 |
标头 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
IRQL | PASSIVE_LEVEL |