Mapper une adresse mémoire sur une variable [dupliquer]
Comment mapper une adresse mémoire à une variable pour créer une structure à cet emplacement mémoire? J'ai essayé le morceau de code suivant pour créer une structure à l'adresse mémoire donnée, mais il vide simplement l'erreur de segmentation?
L'emplacement de la mémoire dans le code est une région d'entrée où je dois définir certaines données et faire sonner la sonnette avec un opcode afin que le CPU récupère les données d'entrée et fasse ce que l'opcode dit faire avec les données dans la région d'entrée
some_struct* some_struct_obj= (some_struct*)0xc321000000;
memset(some_struct_obj, 0x00, sizeof(some_struct));
Réponses
Mapper une adresse mémoire sur une variable
Il n'y a aucun moyen en C ++ de choisir l'emplacement exact d'une variable. Vous ne pouvez choisir que la classe de stockage: automatique, statique ou thread local. L'implémentation du langage choisit l'adresse.
Comment mapper une adresse mémoire sur ... pour créer une structure à cet emplacement mémoire?
Il est possible de créer un objet avec stockage dynamique (qui n'est pas une variable) dans n'importe quelle adresse mémoire tant que cette mémoire est allouée et ne contient pas d'objets non triviaux. Cela peut être réalisé en utilisant une nouvelle expression de placement, ou certaines fonctions standard qui effectuent un nouveau placement en interne.
Il n'y a aucun moyen dans le C ++ standard d'allouer de la mémoire à partir d'une adresse arbitraire. L'implémentation du langage prend en charge l'allocation de mémoire pour les variables et les objets dynamiques.
Sur les systèmes embarqués sans mémoire virtuelle, l'implémentation du langage peut documenter des plages d'adresses mémoire spécifiques telles qu'allouées. Dans ce cas, vous pouvez simplement utiliser le placement nouveau pour créer des objets dans cette mémoire. L'utilisation de telles adresses ne sera pas transférable à d'autres systèmes.
Que diriez-vous d'un moyen non standard? Oui, cela peut exister. Par exemple, la norme POSIX spécifie la mmap
fonction:
pa=mmap(addr, len, prot, flags, fildes, off);
Le paramètre
flags
fournit d'autres informations sur la gestion des données mappées. La valeur des indicateurs est le OU inclusif au niveau du bit de ces options, défini dans <sys / mman.h>:Symbolic Constant Description MAP_SHARED Changes are shared. MAP_PRIVATE Changes are private. MAP_FIXED Interpret addr exactly.
Lorsque
MAP_FIXED
est défini dans l'argument flags, l'implémentation est informée que la valeur de pa doit êtreaddr
exactement.
Pensez cependant à suivre les pages de manuel Linux:
La seule utilisation sûre pour
MAP_FIXED
est où la plage d'adresses spécifiée paraddr
et longueur était précédemment réservée à l'aide d'un autre mappage; sinon, l'utilisation deMAP_FIXED
est dangereuse car elle supprime de force les mappages préexistants, ce qui permet à un processus multithread de corrompre facilement son propre espace d'adressage.