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) 이상 버전의 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) |