CopyDeviceMemory 함수
CopyDeviceMemory 함수는 개발자가 디바이스 메모리에 액세스할 때 맞춤 오류가 생성되지 않도록 해야 하는 상황에서 컴파일러 최적화의 간섭 없이 한 위치에서 다른 위치로 메모리를 복사합니다.
Important
일부 정보는 상용 출시되기 전에 실질적으로 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
매개 변수
Param Destination [out]
복사된 블록 대상의 시작 주소에 대한 포인터입니다.
Param 원본 [in]
복사할 메모리 블록의 시작 주소에 대한 포인터입니다.
Param Length [in]
복사할 메모리 블록의 크기(바이트)입니다.
구문
volatile void*
__cdecl
CopyDeviceMemory (
_Out_writes_bytes_all_(Length) volatile void* Destination,
_In_reads_bytes_(Length) volatile const void* Source,
SIZE_T Length
);
설명
이 API는 개발자가 디바이스 메모리에 액세스할 때 맞춤 오류가 생성되지 않도록 해야 하는 상황에서 CopyVolatileMemory 동작(즉, 컴파일러 최적화의 간섭 없이 한 위치에서 다른 위치로 메모리 복사)을 제공하기 위해 존재합니다. API에는 다음과 같은 속성이 있습니다.
- API는 컴파일러 내장 함수로 인식되지 않으므로 컴파일러는 호출을 완전히 최적화하지 않습니다(또는 호출을 "동등한" 명령 시퀀스로 대체). 이는 다양한 컴파일러 최적화가 적용되는 CopyMemory와 다릅니다.
- 호출이 반환되면 데이터가 원본에서 대상으로 복사됩니다. 원본 및 대상에 대한 이 함수 메모리 액세스는 함수 내에서만 수행됩니다(즉, 컴파일러가 이 함수에서 메모리 액세스를 이동할 수 없음).
- API는 CPU가 디바이스 메모리에서 정렬되지 않은 메모리 액세스를 지원하는 경우에만 정렬되지 않은 메모리 액세스를 수행할 수 있습니다. CPU가 정렬되지 않은 디바이스 메모리 액세스를 지원하지 않는 경우 정렬된 액세스만 수행됩니다.
- API는 복사 작업의 일부로 메모리 위치에 두 번 이상 액세스할 수 있습니다.
- 원본과 대상이 서로 겹치는 경우 복사 작업을 지원하지 않습니다. 겹치는 버퍼가 제공되면 오류 코드 FAST_FAIL_INVALID_ARG 함께 빠르게 실패합니다.
참고 항목
이 함수는 디바이스 메모리로 매핑된 메모리에 액세스하기 위한 CPU 요구 사항만 준수되도록 보장합니다. 특정 디바이스에 액세스하기 위한 고유한 요구 사항이 있는 경우 이 함수를 사용하면 안 됩니다(대신 개발자는 자체 접근자 함수를 구현해야 합니다). 예를 들어 이 함수는 CPU 자체가 이러한 요구 사항을 적용하지 않는 한 생성된 메모리 액세스의 크기를 보장하지 않습니다.
참고 항목
이 함수는 최신 버전뿐만 아니라 모든 버전의 Windows에서 작동합니다. 헤더에서 함수 선언을 얻으려면 최신 SDK를 winbase.h
사용해야 합니다. 최신 SDK의 라이브러리(volatileaccessu.lib
)도 필요합니다. 그러나 결과 이진 파일은 이전 버전의 Windows에서 잘 실행됩니다.
예시
UCHAR* CopyBuffer;
// In this scenario we are copying data from memory mapped
// as "device memory" (i.e. memory not backed by RAM). On
// some platforms like ARM64, device memory cannot tolerate
// memory accesses that are not naturally aligned (i.e. a 4-byte
// load must be 4-byte aligned). Functions like mempcy, CopyMemory,
// and even CopyVolatileMemory may perform unaligned memory accesses
// because it is typically faster to do this.
// To ensure only naturally aligned accesses happen, use CopyDeviceMemory.
CopyDeviceMemory(CopyBuffer, DeviceMemoryBuffer, 100);
요구 사항
지원되는 최소 클라이언트: Windows 11 Insider Preview 빌드 TBD
헤더: winbase.h(Winbase.h 포함)
커널 모드 라이브러리: volatileaccessk.lib
사용자 모드 라이브러리: volatileaccessu.lib