Funzione CopyDeviceMemory

La funzione CopyDeviceMemory copia la memoria da una posizione a un'altra senza interferenze dalle ottimizzazioni del compilatore in situazioni in cui lo sviluppatore deve anche assicurarsi che gli errori di allineamento non verranno generati durante l'accesso alla memoria del dispositivo.

Importante

Alcune informazioni riguardano un prodotto in versione preliminare che può essere modificato in modo sostanziale prima che venga rilasciato commercialmente. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.

Parametri

Destinazione param [out]

Puntatore all'indirizzo iniziale della destinazione del blocco copiato.

Origine param [in]

Puntatore all'indirizzo iniziale del blocco di memoria da copiare.

Lunghezza param [in]

Dimensione del blocco di memoria da copiare, in byte.

Sintassi

volatile void*
  __cdecl
  CopyDeviceMemory (
    _Out_writes_bytes_all_(Length) volatile void* Destination,
    _In_reads_bytes_(Length) volatile const void* Source,
    SIZE_T Length
  );

Osservazioni:

Questa API esiste per fornire un comportamento CopyVolatileMemory (ad esempio, la copia della memoria da una posizione a un'altra senza interferenze dalle ottimizzazioni del compilatore) in situazioni in cui lo sviluppatore deve anche assicurarsi che gli errori di allineamento non vengano generati durante l'accesso alla memoria del dispositivo. L'API ha le proprietà seguenti:

  • L'API non viene riconosciuta come intrinseco del compilatore, quindi il compilatore non ottimizza mai la chiamata (interamente o sostituisce la chiamata con una sequenza di istruzioni "equivalente"). Questo comportamento è diverso da CopyMemory , soggetto a un'ampia gamma di ottimizzazioni del compilatore.
  • Al termine della chiamata, i dati sono stati copiati da Origine a Destinazione. Questa funzione consente l'accesso alla memoria all'origine e alla destinazione solo all'interno della funzione, ovvero il compilatore non può spostare gli accessi alla memoria da questa funzione.
  • L'API può eseguire accessi in memoria non idonei solo se la CPU supporta gli accessi in memoria non idonei nella memoria del dispositivo. Se la CPU non supporta gli accessi non idonei alla memoria del dispositivo, verranno eseguiti solo gli accessi allineati.
  • L'API può accedere ai percorsi di memoria più di una volta come parte dell'operazione di copia.
  • Non supporta le operazioni di copia quando l'origine e la destinazione si sovrappongono tra loro. Se vengono forniti buffer sovrapposti, si verifica un errore rapido con il codice di errore FAST_FAIL_INVALID_ARG.

Nota

Questa funzione garantisce solo che i requisiti della CPU per l'accesso alla memoria mappata come memoria del dispositivo siano rispettati. Se un dispositivo specifico ha requisiti specifici per l'accesso, questa funzione non deve essere usata e, invece, lo sviluppatore deve implementare le proprie funzioni di accesso. Ad esempio, questa funzione non garantisce le dimensioni degli accessi alla memoria generati (a meno che la CPU non applichi questi requisiti).

Nota

Questa funzione funziona su tutte le versioni di Windows, non solo sulla versione più recente. È necessario usare l'SDK più recente per ottenere la dichiarazione di funzione dall'intestazione winbase.h . È necessaria anche la libreria (volatileaccessu.lib) dall'SDK più recente. Tuttavia, il file binario risultante verrà eseguito correttamente nelle versioni precedenti di Windows.

Esempio

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);

Requisiti

Client minimo supportato: Windows 11 Insider Preview Build TBD

Intestazione: winbase.h (include Winbase.h)

Libreria in modalità kernel: volatileaccessk.lib

Libreria in modalità utente: volatileaccessu.lib

Vedi anche