Функция CopyDeviceMemory

Функция CopyDeviceMemory копирует память из одного расположения в другое без вмешательства из оптимизации компилятора в ситуациях, когда разработчику необходимо дополнительно убедиться, что при доступе к памяти устройства не будут создаваться ошибки выравнивания.

Важно!

Некоторые сведения относятся к предварительному продукту, который может быть существенно изменен до его коммерческого выпуска. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

Параметры

Назначение Param [out]

Указатель на начальный адрес места назначения скопированного блока.

Источник Param [in]

Указатель на начальный адрес блока памяти для копирования.

Длина param [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 может выполнять неуправляемый доступ к памяти только в том случае, если ЦП поддерживает неуправляемый доступ к памяти устройства. Если ЦП не поддерживает неуправляемый доступ к памяти устройства, будут выполнены только выровненные доступы.
  • API может получить доступ к расположениям памяти более одного раза в рамках операции копирования.
  • Не поддерживает операции копирования, когда источник и назначение перекрываются друг с другом. Если предоставляются перекрывающиеся буферы, быстрый сбой с кодом ошибки FAST_FAIL_INVALID_ARG.

Примечание.

Эта функция гарантирует, что требования ЦП к доступу к памяти, сопоставленной с памятью устройства, соблюдаются. Если у конкретного устройства есть собственные требования к доступу, эта функция не должна использоваться (и вместо этого разработчик должен реализовать собственные функции доступа). Например, эта функция не гарантирует размер созданного доступа к памяти (если только ЦП не применяет эти требования).

Примечание.

Эта функция работает во всех версиях Windows, а не только на последних версиях. Чтобы получить объявление функции из заголовка winbase.h , необходимо использовать последний пакет SDK. Вам также нужна библиотека (volatileaccessu.lib) из последнего пакета SDK. Однако результирующий двоичный файл будет работать в более ранних версиях 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);

Requirements

Минимальный поддерживаемый клиент: сборка предварительной версии Windows 11 Insider Preview ТБ D

Заголовок: winbase.h (включая Winbase.h)

Библиотека режима ядра: volatileaccessk.lib

Библиотека пользовательского режима: volatileaccessu.lib

См. также