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이 첫 번째 주소 범위에서 요청된 바이트 수를 할당할 수 없는 경우 추가 주소 범위를 반복하여 더 많은 페이지를 가져옵니다. 각 반복에서 MmAllocatePagesForMdlSkipBytes 값을 이전 시작 주소에 추가하여 다음 주소 범위의 시작을 가져옵니다.

[in] HighAddress

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

[in] SkipBytes

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

[in] TotalBytes

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

반환 값

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

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

설명

Windows Server 2003 SP1(서비스 팩 1) 이상 버전의 Windows에서 실행되는 드라이버는 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 이 단일 호출에서 할당할 수 있는 최대 메모리 양은 (4기가바이트 - 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