Mapper une adresse mémoire sur une variable [dupliquer]

Aug 18 2020

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

1 eerorika Aug 17 2020 at 22:43

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 mmapfonction:

pa=mmap(addr, len, prot, flags, fildes, off);

Le paramètre flagsfournit 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_FIXEDest défini dans l'argument flags, l'implémentation est informée que la valeur de pa doit être addrexactement.

Pensez cependant à suivre les pages de manuel Linux:

La seule utilisation sûre pour MAP_FIXEDest où la plage d'adresses spécifiée par addret longueur était précédemment réservée à l'aide d'un autre mappage; sinon, l'utilisation de MAP_FIXEDest dangereuse car elle supprime de force les mappages préexistants, ce qui permet à un processus multithread de corrompre facilement son propre espace d'adressage.