다음을 통해 공유


MmAllocatePagesForMdl 함수(wdm.h)

MmAllocatePagesForMdl 루틴은 0으로 채워진 페이지가 없는 실제 메모리 페이지를 MDL에 할당합니다.

통사론

PMDL MmAllocatePagesForMdl(
  [in] PHYSICAL_ADDRESS LowAddress,
  [in] PHYSICAL_ADDRESS HighAddress,
  [in] PHYSICAL_ADDRESS SkipBytes,
  [in] SIZE_T           TotalBytes
);

매개 변수

[in] LowAddress

할당된 페이지가 올 수 있는 첫 번째 주소 범위의 시작 부분의 실제 주소를 지정합니다. MmAllocatePagesForMdl 첫 번째 주소 범위에서 요청된 바이트 수를 할당할 수 없는 경우 추가 주소 범위를 반복하여 더 많은 페이지를 가져옵니다. 각 반복에서 MmAllocatePagesForMdl 이전 시작 주소에 SkipBytes 값을 추가하여 다음 주소 범위의 시작을 가져옵니다.

[in] HighAddress

할당된 페이지가 올 수 있는 첫 번째 주소 범위 끝의 실제 주소를 지정합니다.

[in] SkipBytes

할당된 페이지가 올 수 있는 이전 주소 범위의 시작에서 건너뛸 바이트 수를 지정합니다. SkipBytes 가상 메모리 페이지 크기의 정수 배수(바이트)여야 합니다.

[in] TotalBytes

MDL에 할당할 총 바이트 수를 지정합니다.

반환 값

MmAllocatePagesForMdl 다음 중 하나를 반환합니다.

반환 코드 묘사
MDL 포인터 MDL 포인터는 지정된 주소 범위의 실제 페이지 집합을 설명합니다. 요청된 바이트 수를 사용할 수 없는 경우 MDL은 사용 가능한 만큼의 실제 메모리를 설명합니다.
NULL 지정된 주소 범위에 실제 메모리 페이지가 없거나 MDL 자체에 대한 메모리 풀이 부족합니다.

발언

Windows Server 2003 SP1(서비스 팩 1) 이상 버전에서 실행되는 드라이버는 MmAllocatePagesForMdl대신 MmAllocatePagesForMdlEx 루틴을 사용해야 합니다. MmAllocatePagesForMdlEx TLB(변환 lookaside 버퍼) 및 캐시 메모리의 불필요한 플러시를 방지하여 MmAllocatePagesForMdl 보다 더 나은 성능을 제공합니다.

MmAllocatePagesForMdl 반환되는 실제 메모리 페이지는 일반적으로 연속 페이지가 아닙니다. MmAllocatePagesForMdl 항상 반환된 MDL의 할당된 페이지를 0으로 채웁니다.

MmAllocatePagesForMdl 해당 가상 주소가 필요하지 않은 커널 모드 드라이버(즉, 물리적 페이지가 필요하고 페이지가 물리적으로 연속될 필요가 없음) 또는 디바이스의 실제 메모리가 특정 물리적 주소 범위에 할당될 경우 상당한 성능 향상을 달성할 수 있는 커널 모드 드라이버에서 사용하도록 설계되었습니다. AGP 그래픽 카드용 드라이버는 이러한 드라이버의 예입니다.

요청된 범위에서 현재 사용할 수 있는 실제 메모리 양에 따라 MmAllocatePagesForMdl 요청된 것보다 적은 메모리를 설명하는 MDL을 반환할 수 있습니다. 메모리가 할당되지 않은 경우 루틴은 NULL 반환합니다. 호출자는 MDL에 실제로 할당된 메모리 양을 확인해야 합니다.

호출자는 MmFreePagesFromMdl 사용하여 MmAllocatePagesForMdl만든 MDL에서 설명하는 메모리 페이지를 해제해야 합니다. MmFreePagesFromMdl호출한 후 호출자는 ExFreePool 호출하여 MDL 구조 자체에 할당된 메모리를 해제해야 합니다.

Windows 2000 이상 버전의 Windows에서는 MmAllocatePagesForMdl 단일 호출에 할당할 수 있는 최대 메모리 양은 (4GB - PAGE_SIZE)입니다. 이 루틴은 충분한 페이지를 사용할 수 있는 경우에만 이 양에 대한 할당 요청을 충족할 수 있습니다.

MmAllocatePagesForMdl IRQL <= APC_LEVEL 실행됩니다. Windows Server 2008 이상 버전의 Windows 운영 체제를 사용하면 MmAllocatePagesForMdl 호출자가 DISPATCH_LEVEL 호출할 수 있습니다. 그러나 APC_LEVEL 이하에서 호출하여 드라이버 성능을 향상시킬 수 있습니다.

특수 커널 비동기 프로시저 호출(APC)에서 MmAllocatePagesForMdl 호출하면 전용 잠금을 재귀적으로 획득할 수 있으며, 이는 중요한 지역(사용자 또는 일반 커널 APC 사용 안 함)에만 있지만 보호된 지역(모든 APC 사용 안 함)에는 없습니다.

요구 사항

요구
대상 플랫폼 보편적
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL 설명 섹션을 참조하세요.
DDI 규정 준수 규칙 HwStorPortProhibitedDDIs(storport), IrqlMmApcLte(wdm), SpNoWait(storport), StorPortStartIo(storport)

참고 항목

ExFreePool

MmAllocatePagesForMdlEx

MmFreePagesFromMdl

mmMapLockedPages