RtlFillDeviceMemory 함수(wdm.h)
RtlFillDeviceMemory 함수는 개발자가 디바이스 메모리에 액세스할 때 맞춤 오류가 생성되지 않도록 해야 하는 상황에서 RtlFillVolatileMemory 동작(예: 컴파일러 최적화의 간섭 없이 버퍼의 내용 설정)을 제공합니다.
구문
volatile void * RtlFillDeviceMemory(
[out] volatile void *Destination,
[in] size_t Length,
[in] int Fill
);
매개 변수
[out] Destination
채울 메모리 블록의 시작 주소에 대한 포인터입니다.
[in] Length
채울 메모리 블록의 크기(바이트)입니다. 이 값은 대상 버퍼의 크기보다 작아야 합니다.
[in] Fill
메모리 블록을 채울 바이트 값입니다.
반환 값
Destination 값을 반환 합니다.
설명
함수는 컴파일러 내장 함수로 인식되지 않으므로 컴파일러는 호출을 최적화하지 않습니다(호출을 완전히 또는 동등한 명령 시퀀스로 대체). 이는 다양한 컴파일러 최적화의 적용을 받는 RtlFillMemory 와 다릅니다.
호출이 완료되면 버퍼를 원하는 값으로 덮어씁니다. 대상에 대한 이 함수 메모리 액세스는 함수 내에서만 수행됩니다(예: 컴파일러는 이 함수에서 메모리 액세스를 이동할 수 없음).
이 함수는 CPU가 디바이스 메모리에서 정렬되지 않은 메모리 액세스를 지원하는 경우에만 정렬되지 않은 메모리 액세스를 수행할 수 있습니다. CPU가 정렬되지 않은 디바이스 메모리 액세스를 지원하지 않는 경우 정렬된 액세스만 수행됩니다.
함수는 작업의 일부로 메모리 위치에 두 번 이상 액세스할 수 있습니다.
참고
이 함수는 디바이스 메모리로 매핑된 메모리에 액세스하기 위한 CPU의 요구 사항만 준수되도록 보장합니다. 특정 디바이스에 액세스하기 위한 고유한 특정 요구 사항이 있는 경우 이 함수를 사용하면 안 됩니다(대신 개발자는 자체 접근자 함수를 구현해야 합니다). 예를 들어 이 함수는 CPU 자체가 이러한 요구 사항을 적용하지 않는 한 생성된 메모리 액세스의 크기를 보장하지 않습니다.
참고
이 함수는 최신 버전뿐만 아니라 모든 버전의 Windows에서 작동합니다. wdm.h 헤더에서 함수 선언을 얻으려면 최신 WDK를 사용해야 합니다. 또한 최신 WDK의 라이브러리(volatileaccessk.lib)도 필요합니다. 그러나 결과 드라이버는 이전 버전의 Windows에서 정상적으로 실행됩니다.
예제
// In this scenario we are setting data on memory mapped
// as "device memory" (for example, memory not backed by RAM).
// On some platforms like ARM64, device memory cannot tolerate
// memory accesses that are not naturally aligned (for example, a 4-byte
// load must be 4-byte aligned). Functions like memset, RtlFillMemory,
// and even RtlFillVolatileMemory may perform unaligned memory accesses
// because it is typically faster to do this.
// To ensure only naturally aligned accesses happen, use RtlFillDeviceMemory.
RtlFillDeviceMemory(DeviceMemoryBuffer, 100, 0xAA);
요구 사항
요구 사항 | 값 |
---|---|
헤더 | wdm.h(Wdm.h 포함) |
라이브러리 | volatileaccessk.lib(커널 모드), volatileaccessu.lib(사용자 모드) |