Skip to main content

XMemVirtualAlloc

호출 프로세스의 가상 주소 공간에서 페이지 영역을 예약, 커밋 또는 상태 변경합니다.
표준 Win32 VirtualAlloc과 달리 이 함수로 할당된 메모리는 자동으로 0으로 초기화되도록 보장되지 않습니다.

구문

매개 변수

BaseAddress _In_opt_
형식: PVOID
할당할 영역의 시작 주소입니다. 메모리가 예약 중인 경우 지정된 주소는 할당 세분성(XBOX에서는 4K, 64K 또는 2MB)의 가장 가까운 배수로 반내림됩니다. 메모리가 이미 예약되어 있고 커밋 중인 경우 주소는 다음 페이지 경계로 반내림됩니다. 이 매개 변수가 NULL이면 시스템이 영역을 할당할 위치를 결정합니다.
Size _In_
형식: SIZE_T
영역의 크기(바이트)입니다. BaseAddress 매개 변수가 NULL인 경우 이 값은 다음 페이지 경계로 반올림됩니다. 그렇지 않으면 할당된 페이지에는 _BaseAddress_에서 BaseAddress+Size 범위 내의 하나 이상의 바이트를 포함하는 모든 페이지가 포함됩니다. 즉, 페이지 경계에 걸쳐 있는 2바이트 범위는 두 페이지가 모두 할당된 영역에 포함되도록 합니다.
AllocationType _In_
형식: DWORD
메모리 할당 유형입니다. 이 매개 변수에는 다음 값 중 하나가 포함되어야 합니다. 이 매개 변수는 다음 값을 지정할 수도 있습니다.
ERA 타이틀의 경우 MEM_LARGE_PAGES는 64K 페이지를 나타냈고, Windows 데스크톱에서는 2MB 페이지를 나타냅니다. 모호성으로 인해 _Microsoft Game Development Kit(GDK)_에서 제거되었습니다.

XMemFlags _In_
형식: ULONGLONG
XBOX에서 특정 특수 메모리 유형을 가져오는 데 사용됩니다. 이 매개 변수에는 다음 값 중 하나가 포함되어야 합니다. XBOX에서는 상위 비트가 사용되지 않도록 보장하는 제한된 가상 메모리 주소를 사용하여 메모리를 할당할 수 있습니다. 다음 값 중 하나를 사용하면 주소가 표시된 비트 수를 사용하도록 제한됩니다. XMEM_40BIT_ADDRESS (0x00007000ULL), XMEM_41BIT_ADDRESS (0x00006000ULL), XMEM_42BIT_ADDRESS (0x00005000ULL), XMEM_43BIT_ADDRESS (0x00004000ULL), XMEM_44BIT_ADDRESS (0x00003000ULL), XMEM_45BIT_ADDRESS (0x00002000ULL), XMEM_46BIT_ADDRESS (0x00001000ULL).
그래픽 메모리는 D3D12Device가 생성되기 전이나 D3DConfigureVirtualMemory가 호출되기 전에 할당할 수 없습니다. GPU에서 볼 수 있는 메모리가 요청되면 타이틀은 명시적인 그래픽 페이지 보호 플래그도 지정해야 합니다. CPU 페이지 보호 설정을 기반으로 하는 기본값은 더 이상 없습니다. 이는 이전 XBOX OS 버전에서 변경된 사항입니다.
이 매개 변수는 다음 값을 지정할 수도 있습니다. Anaconda 디바이스 및 Anaconda를 에뮬레이션하는 Dante 디바이스에서 고급 타이틀 메모리 모드를 사용하는 동안 다음 매개 변수도 적용할 수 있습니다. 이 매개 변수는 다른 모든 경우에는 무시됩니다.
이 플래그는 선택 사항입니다. 지정되지 않은 경우 모든 그래픽 할당은 기본적으로 XMEM_GPU_OPTIMAL_BANDWIDTH_PREFERRED를 사용하고 다른 모든 할당은 기본적으로 XMEM_STANDARD_BANDWIDTH_PREFERRED를 사용합니다.
XMemFlags 매개 변수에는 선택적 4자 코드 태그가 포함되어 있습니다. 문자는 a-z, A-Z, 0-9 및 $ 중 어느 것이든 될 수 있습니다. 이 XMemMakeTag 함수를 사용하여 올바른 비트 위치에 태그 값의 올바른 인코딩을 구성할 수 있습니다. 태그는 예약이 아닌 커밋된 메모리 영역에만 연결할 수 있습니다. 이 4자 코드 태그는 매개 변수의 상위 24비트로 표시됩니다. 태그는 XMemVirtualQuery를 통해 검색할 수 있으며 PIX 메모리 분석에도 표시됩니다. 예제:

PageProtection _In_
형식: DWORD
할당할 페이지 영역에 대한 메모리 보호입니다. 페이지가 커밋 중인 경우 메모리 보호 상수 중 하나를 지정할 수 있습니다. PageProtection 매개 변수에 다음 XBOX 관련 값이 허용되며, XMEM_GRAPHICS 또는 XMEM_GRAPHICS_32BIT_ADDRESS가 지정된 경우 하나가 필요합니다. 이 요구 사항은 이전 버전의 XBOX OS에서 변경된 사항입니다. XMEM_GRAPHICS로 할당된 범위 내의 메모리 주소에 대해 다른 메모리 관리 함수(예: VirtualProtect)에도 이 값을 지정할 수 있습니다. 이 매개 변수는 다음 값을 지정할 수도 있습니다.

반환 값

형식: PVOID 함수가 성공하면 반환 값은 할당된 페이지 영역의 기본 주소입니다. 함수가 실패하면 반환 값은 NULL입니다. 확장 오류 정보를 가져오려면 GetLastError를 호출하세요.

설명

각 페이지에는 연결된 페이지 상태가 있습니다. XMemVirtualAlloc 함수는 다음 작업을 수행할 수 있습니다.
  • 예약된 페이지 영역 커밋
  • 사용 가능한 페이지 영역 예약
  • 사용 가능한 페이지 영역을 동시에 예약 및 커밋
XMemVirtualAlloc은 예약된 페이지를 예약할 수 없습니다. 이미 커밋된 페이지를 커밋할 수 있습니다. 즉, 이미 커밋되었는지 여부에 관계없이 페이지 범위를 커밋할 수 있으며 함수가 실패하지 않습니다. XMemVirtualAlloc을 사용하여 페이지 블록을 예약한 다음 예약된 블록에서 개별 페이지를 커밋하기 위해 XMemVirtualAlloc에 대한 추가 호출을 수행할 수 있습니다. 이를 통해 프로세스는 필요할 때까지 물리적 저장소를 사용하지 않고 가상 주소 공간의 범위를 예약할 수 있습니다. BaseAddress 매개 변수가 NULL이 아닌 경우 함수는 BaseAddress 및 Size 매개 변수를 사용하여 할당할 페이지 영역을 계산합니다. 전체 페이지 범위의 현재 상태는 AllocationType 매개 변수에 지정된 할당 유형과 호환되어야 합니다. 그렇지 않으면 함수가 실패하고 페이지가 할당되지 않습니다. 이 호환성 요구 사항은 앞서 언급한 대로 이미 커밋된 페이지를 커밋하는 것을 배제하지 않습니다. XMemVirtualAlloc 함수를 사용하여 물리적 페이지 매핑에 지정된 호출 프로세스의 가상 주소 공간 내에 메모리 영역을 예약할 수 있습니다. 그런 다음 이 메모리 영역을 사용하여 애플리케이션의 요구에 따라 물리적 페이지를 가상 메모리에 매핑하고 해제할 수 있습니다. MEM_RESERVE 및 MEM_64K_PAGES 값은 AllocationType 매개 변수에 설정되어야 합니다. MEM_COMMIT 값은 설정되어서는 안 됩니다. XMemFlags 매개 변수에 XMEM_MAPPABLE이 설정되어야 합니다. 이렇게 예약된 주소 공간은 XMemMapPhysicalPages API를 사용하여 커밋됩니다. VirtualFree 함수는 커밋된 페이지의 커밋을 해제하고 페이지의 저장소를 해제하거나, 커밋된 페이지의 커밋을 해제하고 동시에 해제할 수 있습니다. 또한 예약된 페이지를 해제하여 사용 가능한 페이지로 만들 수도 있습니다. XBOX 관련 메모리 특성에 대한 확장을 제공하는 것 외에도 이 API는 반환된 메모리가 0으로 초기화된다는 보장을 강제하지 않는다는 점에서 VirtualAlloc과 다릅니다. 또한 XMemVirtualAlloc은 이전 메모리 콘텐츠를 유지한다는 보장도 하지 않습니다. 게임에서 XMemVirtualAlloc의 대부분의 사용 사례는 그래픽 메모리를 가져오는 것(일반적으로 0으로 초기화되는 것에서 이점을 얻지 못함) 또는 0으로 초기화하는 것에서 거의 유용한 값을 얻지 못하는 힙 구현에 메모리를 추가하는 것을 포함합니다. 또한 호출자가 원하는 시점에 반환 메모리를 0으로 초기화하는 것을 구현하는 것은 사소한 일입니다. VirtualAlloc의 이러한 보장을 강제하지 않음으로써 XMemVirtualAlloc의 구현은 더 높은 성능을 제공할 수 있는 더 많은 유연성을 갖게 됩니다. XMemVirtualAlloc은 이 API 호출을 통해 얻은 메모리를 즉시 사용할 수 있다는 점에서도 VirtualAlloc과 다릅니다. 반대로 VirtualAlloc이 반환한 메모리 주소는 값비싼 페이지 폴트 작업을 통해 첫 번째 액세스 시에만 물리적 페이지로 채워집니다. XMemVirtualAlloc으로 할당된 메모리는 VirtualFree로 해제되어야 합니다. PAGE_NOCACHE 및 PAGE_WRITECOMBINE 페이지 보호 플래그는 메모리 예약 시점에 고정되며 나중에 커밋 요청 중에 변경할 수 없습니다. 메모리가 커밋된 경우 이러한 플래그 중 하나의 상태를 변경하려는 시도는 자동으로 무시됩니다. 메모리 커밋은 성공하지만 메모리는 이러한 플래그에 대해 원래 상태를 갖습니다. 예제:

요구 사항

헤더: xmem.h 라이브러리: xmem.lib 지원 플랫폼: XBOX One 제품군 콘솔 및 XBOX Series 콘솔

함께 보기

XMem 참조
XMemMapPhysicalPages
VirtualFree
마지막 수정일 2026년 10월 5일