> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# XMemMapPhysicalPages

> XMemMapPhysicalPages

# XMemMapPhysicalPages

[XMemAllocatePhysicalPages](/reference/system/xmem/functions/xmemallocatephysicalpages)로 할당된 페이지를 가상 주소 공간에 매핑합니다.

## 구문

```cpp theme={null}
PVOID XMemMapPhysicalPages(  
         PVOID VirtualAddress,  
         ULONG_PTR NumberOfPages,  
         PULONG_PTR PageArray  
)  
```

### 매개 변수

*VirtualAddress*   \_In\_\
형식: PVOID

페이지를 매핑할 주소입니다.

*NumberOfPages*   \_In\_\
형식: ULONG\_PTR

*PageArray*의 항목 수입니다.

*PageArray*   \_In\_reads\_opt\_(NumberOfPages)\
형식: PULONG\_PTR

매핑할 페이지를 나타내는 페이지 프레임 번호 배열입니다.

### 반환 값

형식: PVOID

물리적 페이지가 매핑된 가상 주소이거나, 매핑 실패가 있는 경우 NULL입니다.

매핑 실패 시 확장 오류 정보를 가져오려면 <a href="https://msdn.microsoft.com/library/windows/desktop/ms679360(v=vs.85).aspx">GetLastError</a>를 호출하세요.

## 설명

가상 주소 범위는 **MEM\_RESERVE**, **MEM\_64K\_PAGES** 또는 **MEM\_2MB\_PAGES** 페이지 크기 및 **XMEM\_MAPPABLE** 플래그로 [XMemVirtualAlloc](/reference/system/xmem/functions/xmemvirtualalloc)에 대한 호출을 통해 이전에 예약되어 있어야 합니다. VirtualAlloc로 만든 **MEM\_PHYSICAL** 주소 예약은 이 메모리를 매핑하는 데 사용할 수 없습니다.

가상 주소 범위에 이미 매핑된 페이지가 있는 경우 해당 페이지의 매핑이 해제됩니다. 또한 메모리 영역을 커밋 해제하기 위해 PageArray에 NULL을 지정할 수 있습니다.

**XMemMapPhysicalPages**는 동일한 물리적 페이지를 가상 주소 공간에 여러 번 매핑하는 데 사용할 수 있습니다. 페이지가 여러 번 매핑되는 경우 다중 매핑은 동일한 캐싱 특성을 지정해야 합니다(캐시 특성이 제공되지 않으면 CPU coherent가 암시되고, 그렇지 않으면 목록은 **PAGE\_NOCACHE** 또는 **PAGE\_WRITECOMBINE**입니다).

<Note>MEM\_2MB\_PAGES로 예약된 메모리에 물리적 페이지를 매핑할 때, 물리적 페이지는 XMEM\_2MB\_CLUSTERS로 할당되어야 합니다. PageArray 매개 변수에는 각 2MB 클러스터의 첫 번째 물리적 페이지만 포함되어야 합니다.</Note>

예제:

```cpp theme={null}
ULONG_PTR PageArray[64];
ULONG_PTR PageCount = RTL_NUMBER_OF(PageArray);
XMemAllocatePhysicalPages(XMEM_2MB_CLUSTERS, &PageCount, PageArray);

// 4MB의 예약 공간을 64KB 페이지 크기와 2MB 페이지 크기 모두로 할당합니다
PVOID RWAddress = XMemVirtualAlloc(NULL,
    4 * 1024 * 1024,
    MEM_64K_PAGES | MEM_RESERVE,
    XMEM_CPU | XMEM_MAPPABLE,
    PAGE_READWRITE);

PVOID ROAddress = XMemVirtualAlloc(NULL,
    4 * 1024 * 1024,
    MEM_2MB_PAGES | MEM_RESERVE,
    XMEM_CPU | XMEM_MAPPABLE,
    PAGE_READONLY);

// 물리적 페이지를 64k 주소 예약에 매핑합니다
XMemMapPhysicalPages(RWAddress, PageCount, PageArray);

// 물리적 페이지를 2MB 주소 예약에 매핑합니다
// 각 2MB 런의 첫 번째 물리적 페이지만 사용합니다
ULONG_PTR PageArray2MB[2];
PageArray2MB[0] = PageArray[0];
PageArray2MB[1] = PageArray[32];
XMemMapPhysicalPages(ROAddress, 2, PageArray2MB);

memset(RWAddress, 0x17, 4 * 1024 * 1024);
assert (memcmp(RWAddress, ROAddress, 4 * 1024 * 1024)==0);

// 영역의 매핑을 해제합니다. 주소 예약은 유지됩니다
XMemMapPhysicalPages(ROAddress, 2, NULL);
XMemMapPhysicalPages(RWAddress, 64, NULL);

// 물리적 페이지를 MM으로 다시 해제합니다
XMemFreePhysicalPages(PageCount, PageArray);

// 두 개의 예약된 주소 영역을 해제합니다
VirtualFree(RWAddress, 0, MEM_RELEASE);
VirtualFree(ROAddress, 0, MEM_RELEASE);
```

## 요구 사항

**헤더:** xmem.h

**라이브러리:** xmem.lib

**지원 플랫폼:** XBOX One 제품군 콘솔 및 XBOX Series 콘솔

## 함께 보기

[XMem 참조](/reference/system/xmem/xmem_members)\
[XMemVirtualAlloc](/reference/system/xmem/functions/xmemvirtualalloc)\
<a href="https://learn.microsoft.com/en-us/windows/desktop/api/memoryapi/nf-memoryapi-virtualfree">VirtualFree</a>\
[XMemFreePhysicalPages](/reference/system/xmem/functions/xmemfreephysicalpages)
