2014-01-14 2 views
2

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

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

Что было бы правильным путем?

Благодаря

+0

Я никогда не использовал numa, но глядя на страницу man, будет 'numa_interleave_memory()' help? –

ответ

3

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

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

+0

Спасибо! Если Pin действительно изменит расположение памяти, отключить ASLR будет недостаточно для меня. – iomartin

2

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

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

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

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

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

Смежные вопросы