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 구조체에 대한 포인터입니다. 이 구조체는 드라이버의 버스 master 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 범위의 숫자입니다. 1 프로세서 시스템 또는 비 NUMA 다중 프로세서 시스템의 경우 PreferredNode 를 0으로 설정합니다.
반환 값
AllocateCommonBufferEx 는 공통 버퍼에 할당된 메모리의 가상 주소를 반환합니다. 버퍼를 할당할 수 없는 경우 NULL이 반환됩니다.
설명
AllocateCommonBufferEx 는 이름으로 직접 호출할 수 있는 시스템 루틴이 아닙니다. 이 루틴은 DMA_OPERATIONS 구조에서 반환된 주소의 포인터로만 호출할 수 있습니다. 드라이버는 DeviceDescription 매개 변수의 Version 멤버가 DEVICE_DESCRIPTION_VERSION3 설정된 IoGetDmaAdapter를 호출하여 이 루틴의 주소를 가져옵니다. 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 작업에 대한 자세한 내용은 다음 topics 참조하세요.
Common-Buffer Bus-Master DMA 사용
요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows 8 사용하여 사용할 수 있습니다. |
대상 플랫폼 | 데스크톱 |
헤더 | wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함) |
IRQL | PASSIVE_LEVEL |