Forcer l’allocation de mémoire toujours à la même adresse virtuelle

J’expérimente avec Pin , un outil d’instrumentation, que je utilise pour calculer des statistiques en fonction de l’adresse mémoire de mes variables. Je souhaite ré-exécuter mon programme avec les informations recueillies par mon outil d’instrumentation, mais pour cela, il est essentiel que les adresses de mémoire virtuelle restnt les mêmes après différentes exécutions.

En général, je devrais laisser le système d’exploitation gérer l’allocation de mémoire, mais dans ce cas, j’ai besoin d’un moyen de le forcer à toujours allouer à la même adresse virtuelle. En particulier, je suis intéressé par un très long tableau, que numa_alloc_onnode() actuellement avec numa_alloc_onnode() , bien que je puisse utiliser autre chose.

Quelle serait la bonne façon de procéder?

Merci

Vous pouvez essayer mmap (2).

La version instrumentée de votre programme utilisera une structure de mémoire différente de celle du programme original, car pin a besoin de mémoire pour la traduction dynamic, etc. et modifiera la structure de mémoire. (si je me souviens bien)

À l’exception de la randomisation de la disposition des espaces d’adressage, la plupart des allocateurs de mémoire, des chargeurs et des routines système d’atsortingbution d’adresses de mémoire virtuelle renverront les mêmes résultats pour les mêmes appels et les mêmes données (non par conception délibérée mais par conséquence naturelle du fonctionnement du logiciel . Donc, vous devez:

  • Désactiver la randomisation de la disposition d’espace d’adressage.
  • Assurez-vous que votre programme s’exécute de la même manière à chaque fois.

La randomisation de la disposition des espaces d’adressage consiste à modifier délibérément l’espace d’adressage pour déjouer les attaquants: si les adresses sont modifiées à chaque exécution du programme, il est plus difficile pour les attaques d’utiliser divers exploits pour contrôler le code exécuté. Il ne devrait être désactivé que temporairement et uniquement à des fins de débogage. Cette réponse montre une méthode et des liens vers plus d’informations, mais la méthode exacte peut dépendre de la version de Linux que vous utilisez.

Votre programme peut s’exécuter différemment pour diverses raisons, telles que l’utilisation de threads, l’utilisation de signaux asynchrones ou la communication interprocessus. Ce sera à vous de contrôler cela dans votre programme.

En règle générale, il n’est pas garanti que l’allocation de mémoire soit reproductible. Les résultats que vous obtenez peuvent être tels quels.