Función CopyDeviceMemory
La función CopyDeviceMemory copia la memoria de una ubicación a otra sin interferencias de las optimizaciones del compilador en situaciones en las que el desarrollador debe asegurarse además de que no se generarán errores de alineación al acceder a la memoria del dispositivo.
Importante
Parte de la información hace referencia a un producto de versión preliminar que puede sufrir importantes modificaciones antes de que se publique la versión comercial. Microsoft no proporciona ninguna garantía, expresa o implícita, con respecto a la información proporcionada aquí.
Parámetros
Destino del parámetro [out]
Un puntero a la dirección inicial del destino del bloque copiado.
Origen del parámetro [in]
Un puntero a la dirección inicial del bloque de memoria que se va a copiar.
Longitud del parámetro [in]
El tamaño del bloque de memoria que se va a copiar, en bytes.
Sintaxis
volatile void*
__cdecl
CopyDeviceMemory (
_Out_writes_bytes_all_(Length) volatile void* Destination,
_In_reads_bytes_(Length) volatile const void* Source,
SIZE_T Length
);
Comentarios
Esta API existe para proporcionar el comportamiento de CopyVolatileMemory (es decir, copiar la memoria de una ubicación a otra sin interferencias de las optimizaciones del compilador) en situaciones en las que el desarrollador debe asegurarse además de que no se generarán errores de alineación al acceder a la memoria del dispositivo. La API tiene las siguientes propiedades:
- La API no se reconoce como intrínseca del compilador, por lo que este nunca optimizará la llamada (ya sea por completo o reemplazándola por una secuencia "equivalente" de instrucciones). Esto difiere de CopyMemory, que está sujeto a una variedad de optimizaciones del compilador.
- Cuando se devuelve la llamada, los datos se han copiado de Origen a Destino. Esta función solo accederá a la memoria de Origen y Destino dentro de la función (es decir, el compilador no puede mover los accesos de memoria fuera de esta función).
- La API puede realizar accesos a memoria no asignada solo si la CPU admite accesos a memoria no asignada en la memoria del dispositivo. Si la CPU no admite accesos a memoria de dispositivo no asignada, solo se realizarán los accesos asignados.
- La API puede acceder a ubicaciones de memoria más de una vez como parte de su operación de copia.
- No admite operaciones de copia cuando Origen y Destino se superponen entre sí. Si se proporcionan búferes superpuestos, se produce un error rápido con el código de error FAST_FAIL_INVALID_ARG.
Nota:
Esta función solo garantiza que se respeten los requisitos de la CPU para acceder a la memoria asignada como memoria del dispositivo. Si un dispositivo específico tiene sus propios requisitos específicos para el acceso, esta función no debe usarse (y, en su lugar, el desarrollador debe implementar sus propias funciones de descriptor de acceso). Por ejemplo, esta función no garantiza el tamaño de los accesos a memoria generados (a menos que la propia CPU aplique estos requisitos).
Nota:
Esta función funciona en todas las versiones de Windows, no solo en la más reciente. Es necesario consumir el SDK más reciente para obtener la declaración de función del encabezado winbase.h
. También se necesita la biblioteca (volatileaccessu.lib
) del SDK más reciente. Sin embargo, el binario resultante se ejecutará correctamente en versiones anteriores de Windows.
Ejemplo
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);
Requisitos
Cliente mínimo admitido: compilación preliminar de Windows 11 Insider
Encabezado: winbase.h (incluir Winbase.h)
Biblioteca en modo kernel: volatileaccessk.lib
Biblioteca en modo de usuario: volatileaccessu.lib