Fonction FillDeviceMemory
La fonction FillDeviceMemory définit le contenu d’une mémoire tampon sans interférence des optimisations du compilateur dans les situations où le développeur doit également être sûr que des erreurs d’alignement ne seront pas générées lors de l’accès à la mémoire de l’appareil.
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifié avant sa commercialisation. Microsoft n’offre aucune garantie, expresse ou implicite, concernant les informations fournies ici.
Paramètres
Paramètre Destination [out]
Un pointeur vers l’adresse de début du bloc de mémoire à remplir.
Paramètre Length [in]
La taille du bloc de mémoire à remplir, exprimée en octets. Cette valeur doit être inférieure à la taille de la mémoire tampon de destination.
Paramètre Fill [in]
La valeur de l’octet avec laquelle remplir le bloc de mémoire.
Syntaxe
volatile void*
FillDeviceMemory (
_Out_writes_bytes_all_(Length) volatile void* Destination,
SIZE_T Length,
INT Fill
);
Notes
Cette API est destinée à fournir le comportement de FillVolatileMemory (c’est-à-dire définir le contenu d’une mémoire tampon sans interférence avec les optimisations du compilateur) dans les situations où le développeur doit également être sûr que des erreurs d’alignement ne seront pas générées lors de l’accès à la mémoire de l’appareil. L’API a les propriétés suivantes :
- L’API n’est pas reconnue comme étant intrinsèque au compilateur : le compilateur n’optimise donc jamais l’appel (entièrement ou en remplaçant l’appel par une séquence « équivalente » d’instructions). Ceci diffère de FillMemory , qui est soumise à différentes optimisations du compilateur.
- Une fois l’appel terminé, la mémoire tampon a été remplacée par la valeur souhaitée. Ces accès mémoire des fonctions à la Destination seront effectués seulement au sein de la fonction (c’est-à-dire que le compilateur ne peut pas déplacer les accès mémoire en dehors de cette fonction).
- L’API peut effectuer des accès mémoire non alignés seulement si le processeur prend en charge les accès mémoire non alignés sur la mémoire de l’appareil. Si le processeur ne prend pas en charge les accès non alignés à la mémoire des appareils, seuls les accès alignés sont effectués.
- L’API peut accéder plusieurs fois à des emplacements mémoire dans le cadre de son opération.
Remarque
Cette fonction garantit seulement que les exigences du processeur pour accéder à la mémoire mappée en tant que mémoire de l’appareil sont respectées. Si un appareil spécifique a ses propres exigences spécifiques pour l’accès, cette fonction ne doit pas être utilisée (et au lieu de cela, le développeur doit implémenter ses propres fonctions d’accesseur). Par exemple, cette fonction ne garantit pas la taille des accès mémoire générés (sauf si le processeur lui-même applique ces exigences).
Remarque
Cette fonction fonctionne sur toutes les versions de Windows, pas seulement sur la dernière. Vous devez utiliser le SDK le plus récent pour obtenir la déclaration de fonction de l’en-tête winbase.h
. Vous avez également besoin de la bibliothèque (volatileaccessu.lib
) du SDK le plus récent. Cependant, le fichier binaire résultant s’exécutera correctement sur les versions antérieures de Windows.
Exemple
// 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);
Spécifications
Client minimal pris en charge : Windows 11 Insider Preview Build TBD
En-tête : winbase.h (include Winbase.h)
Bibliothèque en mode noyau : volatileaccessk.lib
Bibliothèque en mode utilisateur : volatileaccessu.lib