Función FillDeviceMemory

La función FillDeviceMemory establece el contenido de un búfer sin interferencia de 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]

Puntero a la dirección inicial del bloque de memoria que se va a rellenar.

Longitud del parámetro [in]

Tamaño del bloque de memoria que se va a rellenar, en bytes. Este valor debe ser menor que el tamaño del búfer de destino.

Relleno de parámetros [in]

Valor de byte con el que se va a rellenar el bloque de memoria.

Sintaxis

volatile void*
  FillDeviceMemory (
    _Out_writes_bytes_all_(Length) volatile void* Destination,
    SIZE_T Length,
    INT Fill
  );

Comentarios

Esta API existe para proporcionar el comportamiento FillVolatileMemory (es decir, establecer el contenido de un búfer sin interferencia de optimizaciones del compilador) en situaciones en las que el desarrollador debe asegurarse además de que los errores de alineación no se generará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 el compilador nunca optimizará la llamada (por completo o reemplazará la llamada por una secuencia "equivalente" de instrucciones). Esto difiere de FillMemory, que está sujeto a una variedad de optimizaciones del compilador.
  • Una vez completada la llamada, el búfer se ha sobreescrito con el valor deseado. Los accesos a la memoria de la función Destino sólo se realizarán dentro de la función (es decir, el compilador no puede desplazar los accesos a la 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 de memoria de dispositivo no asignados, solo se realizarán los accesos alineados.
  • La API puede acceder a las ubicaciones de memoria más de una vez como parte de su operación.

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. Debe consumir el SDK más reciente para obtener la declaración de función del winbase.h encabezado. También necesita la biblioteca (volatileaccessu.lib) del SDK más reciente. Sin embargo, el binario resultante se ejecutará correctamente en versiones anteriores de Windows.

Ejemplo

// In this scenario we are setting data on 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 memset, FillMemory,
// and even FillVolatileMemory may perform unaligned memory accesses
// because it is typically faster to do this.
// To ensure only naturally aligned accesses happen, use FillDeviceMemory.

FillDeviceMemory(DeviceMemoryBuffer, 100, 0xAA);

Requisitos

Cliente mínimo admitido: Compilación TBD de Windows 11 Insider Preview

Encabezado: winbase.h (incluya Winbase.h)

Biblioteca en modo kernel: volatileaccessk.lib

Biblioteca en modo de usuario: volatileaccessu.lib

Consulte también