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
버스 마스터 어댑터 또는 DMA 컨트롤러를 나타내는 IoGetDmaAdapter 반환된 DMA_ADAPTER 구조체에 대한 포인터입니다.
[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) |