Принудительное распределение памяти всегда к одному и тому же виртуальному адресу

Я экспериментирую с Pin , инструментом инструментария, который я использую для вычисления некоторых статистических данных, основанных на адресах памяти моих переменных. Я хочу повторно запустить свою программу с информацией, собранной инструментом инструментария, но для этого крайне важно, чтобы адреса виртуальной памяти оставались неизменными при разных запусках.

В общем, я должен позволить ОС обрабатывать выделение памяти, но в этом случае мне нужен какой-то способ заставить его всегда выделять один и тот же виртуальный адрес. В частности, меня интересует очень длинный массив, который я сейчас numa_alloc_onnode() , хотя я мог бы использовать что-то еще.

Каким будет правильный способ?

Спасибо

Вы можете попробовать mmap (2).

Инструментальная версия вашей программы будет использовать другую макет памяти, чем исходная программа, потому что пинчер нуждается в памяти для динамического перевода и т. Д. И изменит макет памяти. (если я правильно помню)

За исключением рандомизации размещения адресного пространства, большинство распределителей памяти, загрузчиков и системных подпрограмм для назначения адресов виртуальной памяти возвращают те же результаты, что и одни и те же вызовы и данные (а не за счет преднамеренного проектирования для этого, а из-за естественного следствия работы программного обеспечения) , Итак, вам нужно:

  • Отключить рандомизацию размещения адресного пространства.
  • Убедитесь, что ваша программа выполняется одинаково каждый раз.

Рандомизация размещения в адресном пространстве – это преднамеренные изменения в адресном пространстве для злоумышленников: если адреса изменяются при каждом выполнении программы, тем труднее для атак использовать различные эксплойты для управления выполняемым кодом. Он должен быть отключен только временно и только для целей отладки. Этот ответ показывает один из способов сделать это и ссылки на дополнительную информацию, но точный метод может зависеть от версии Linux, которую вы используете.

Ваша программа может выполняться по-разному по разным причинам, например, с использованием streamов или использованием асинхронных сигналов или межпроцессного взаимодействия. Вам будет необходимо контролировать это в вашей программе.

Как правило, распределение памяти не может быть воспроизводимым. Полученные вами результаты могут быть основаны на принципе.