다음을 통해 공유


MmAllocateContiguousNodeMemory 함수(wdm.h)

MmAllocateContiguousNodeMemory 루틴은 연속되고 페이지가 지정되지 않은 물리적 메모리 범위를 할당하고 시스템 주소 공간에 매핑합니다.

통사론

PVOID MmAllocateContiguousNodeMemory(
  [in]           SIZE_T           NumberOfBytes,
  [in]           PHYSICAL_ADDRESS LowestAcceptableAddress,
  [in]           PHYSICAL_ADDRESS HighestAcceptableAddress,
  [in, optional] PHYSICAL_ADDRESS BoundaryAddressMultiple,
  [in]           ULONG            Protect,
  [in]           NODE_REQUIREMENT PreferredNode
);

매개 변수

[in] NumberOfBytes

할당할 연속 메모리 블록의 크기(바이트)입니다. 자세한 내용은 비고를 참조하세요.

[in] LowestAcceptableAddress

호출자가 사용할 수 있는 가장 낮은 유효한 실제 주소입니다. 예를 들어 디바이스가 프로세서의 실제 메모리 주소 범위의 처음 8MB를 초과하는 위치만 처리할 수 있는 경우 이 디바이스의 드라이버는 LowAcceptableAddress 0x0000000000800000 설정해야 합니다.

[in] HighestAcceptableAddress

호출자가 사용할 수 있는 가장 높은 유효한 실제 주소입니다. 예를 들어 디바이스가 프로세서의 실제 메모리 주소 범위의 처음 16메가바이트 내의 위치만 처리할 수 있는 경우 이 디바이스의 드라이버는 HighestAcceptableAddress 0x0000000000FFFFFF 설정해야 합니다.

[in, optional] BoundaryAddressMultiple

할당된 버퍼가 교차해서는 안 되는 물리적 주소 배수입니다. 실제 주소 배수는 항상 2의 힘이어야 합니다. 이 매개 변수는 선택 사항이며 디바이스에 특별한 메모리 경계 제한이 없음을 나타내기 위해 0으로 지정할 수 있습니다. 자세한 내용은 비고를 참조하세요.

[in] Protect

할당된 메모리에 사용할 보호를 지정하는 비트에 플래그를 지정합니다. 호출자는 Protect 매개 변수에서 다음 플래그 비트 중 하나(둘 다 아님)를 설정해야 합니다.

플래그 비트 의미
PAGE_READWRITE 읽기/쓰기, NX(실행 안 됨) 메모리를 할당합니다. 대부분의 호출자는 이 플래그 비트를 설정해야 합니다. 자세한 내용은 비고를 참조하세요.
PAGE_EXECUTE_READWRITE 실행 가능한 읽기/쓰기 메모리를 할당합니다. 이 플래그 비트는 호출자가 할당된 메모리에서 명령을 실행하는 기능이 필요한 경우에만 설정해야 합니다.

또한 호출자는 Protect 매개 변수에서 다음 선택적 플래그 비트 중 하나(둘 다 아님)를 설정할 수 있습니다.

플래그 비트 의미
PAGE_NOCACHE 캐시하지 않은 메모리를 할당합니다. 이 플래그 비트는 CacheTypeMmNonCached설정된 MmAllocateContiguousMemorySpecifyCache 호출하는 것과 비슷합니다.
PAGE_WRITECOMBINE 쓰기 결합 메모리를 할당합니다. 이 플래그 비트는 CacheTypeMmWriteCombined설정된 MmAllocateContiguousMemorySpecifyCache 호출하는 것과 비슷합니다.

PAGE_NOCACHE 또는 PAGE_WRITECOMBINE 지정되지 않으면 할당된 메모리가 완전히 캐시됩니다. 이 경우 효과는 CacheTypeMmCached설정된 MmAllocateContiguousMemorySpecifyCache 호출하는 것과 유사합니다.

[in] PreferredNode

기본 설정 노드 번호입니다. 다중 프로세서 시스템에 N 노드가 포함된 경우 노드 번호는 0에서 N-1로 지정됩니다. 호출자가 preferredNode MM_ANY_NODE_OK 설정하면 루틴은 메모리를 할당할 노드를 선택합니다. 그렇지 않으면 지정된 주소 범위의 메모리를 기본 설정 노드에서 할당할 수 없는 경우 루틴은 NULL 반환합니다.

반환 값

MmAllocateContiguousNodeMemory 할당된 메모리에 대한 기본 가상 주소를 반환합니다. 요청을 충족할 수 없는 경우 루틴은 NULL반환합니다.

발언

커널 모드 디바이스 드라이버는 이 루틴을 호출하여 연속된 물리적 메모리 블록을 할당합니다. 호출 드라이버는 할당에 NX(실행 안 됨) 메모리를 사용할지 여부를 지정할 수 있습니다. NUMA(비균등 메모리 액세스) 다중 프로세서 시스템에서 호출자는 메모리를 할당할 기본 노드를 지정할 수 있습니다. 노드는 메모리 영역에 대한 빠른 액세스를 공유하는 프로세서의 컬렉션입니다. 비 NUMA 다중 프로세서 또는 단일 프로세서 시스템에서 MmAllocateContiguousNodeMemory 모든 메모리를 단일 노드에 속하는 것으로 처리하고 이 노드에서 메모리를 할당합니다.

MmAllocateContiguousNodeMemory 실제 주소 공간에서 인접한 비페이지 메모리 블록을 할당합니다. 루틴은 이 블록을 시스템 주소 공간의 연속된 가상 메모리 블록에 매핑하고 이 블록의 기본 가상 주소를 반환합니다. 이 루틴은 연속 메모리 할당의 시작 주소를 메모리 페이지 경계에 맞춥니다.

드라이버는 요청된 할당 크기를 초과하여 메모리에 액세스해서는 안 됩니다. 예를 들어 개발자는 드라이버가 요청된 할당의 끝과 다음 페이지 경계 사이에 메모리를 안전하게 사용할 수 있다고 가정해서는 안 됩니다.

연속된 물리적 메모리는 일반적으로 공급이 부족하기 때문에 필요할 때만 아끼고 사용해야 합니다. 연속 메모리를 사용해야 하는 드라이버는 운영 체제에서 메모리를 할당하고 해제할 때 시간이 지남에 따라 실제 메모리가 조각화될 가능성이 있으므로 드라이버 초기화 중에 이 메모리를 할당해야 합니다. 일반적으로 드라이버는 DriverEntry 루틴에서 MmAllocateContiguousNodeMemory 호출하여 장기 사용을 위해 내부 버퍼를 할당하고 드라이버가 언로드되기 직전에 버퍼를 해제합니다.

메모리가 더 이상 필요하지 않은 경우 MmAllocateContiguousNodeMemory 할당된 메모리를 해제해야 합니다. MmFreeContiguousMemory 루틴을 호출하여 MmAllocateContiguousNodeMemory할당된 메모리를 해제합니다.

MmAllocateContiguousNodeMemoryMmAllocateContiguousMemorySpecifyCacheNode 루틴과 유사합니다. MmAllocateContiguousMemorySpecifyCacheNode달리 MmAllocateContiguousNodeMemory 사용하여 NX(실행 안 됨) 메모리를 할당할 수 있습니다. 드라이버가 할당된 메모리에서 명령을 실행할 수 있는 기능을 명시적으로 요구하지 않는 한 드라이버는 NX 메모리를 할당하는 것이 가장 좋습니다. NX 메모리를 할당하면 드라이버가 악성 소프트웨어에서 이 메모리의 지침을 실행하지 못하도록 방지하여 보안을 향상시킵니다. MmAllocateContiguousMemory, MmAllocateContiguousMemorySpecifyCache할당된 메모리 및 MmAllocateContiguousMemorySpecifyCacheNode 루틴은 항상 실행 가능합니다.

BoundaryAddressMultiple 매개 변수에 0이 아닌 값을 지정하는 경우 할당된 메모리 블록의 실제 주소 범위는 이 값의 정수 배수인 주소 경계를 넘지 않습니다. 하드웨어 제한을 해결하기 위해 0이 아닌 값이 필요한 경우가 아니면 드라이버는 이 매개 변수를 0으로 설정해야 합니다. 예를 들어 디바이스가 16메가바이트 물리적 경계를 넘어 데이터를 전송할 수 없는 경우 드라이버는 이 매개 변수에 대한 0x1000000 값을 지정하여 디바이스에서 볼 수 있는 주소가 16메가바이트 경계에서 래핑되지 않도록 해야 합니다.

MmAllocateContiguousNodeMemory 할당하는 메모리는 초기화되지 않습니다. 커널 모드 드라이버는 사용자 모드 소프트웨어에 표시되도록 하려는 경우(잠재적으로 권한 있는 콘텐츠가 누출되지 않도록) 이 메모리를 먼저 0으로 설정해야 합니다.

요구 사항

요구
지원되는 최소 클라이언트 Windows 8부터 사용할 수 있습니다.
대상 플랫폼 보편적
헤더 wdm.h(Wdm.h, Ntddk.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL

참고 항목

DriverEntry

MmAllocateContiguousMemory

MmAllocateContiguousMemorySpecifyCache

MmAllocateContiguousMemorySpecifyCacheNode

MmFreeContiguousMemory