Является ли mmap детерминированным, если ASLR отключен? - PullRequest
7 голосов
/ 14 января 2012

Если рандомизация размещения адресного пространства (ASLR) отключена, будет ли у нас детерминистический mmap ?Под детерминистическим пониманием я подразумеваю, что если я буду снова и снова запускать одно и то же приложение с одними и теми же входами, получу ли я те же адреса, возвращенные mmap ?В основном меня интересуют анонимные карты.

Ответы [ 3 ]

4 голосов
/ 15 января 2012

Если рандомизация размещения адресного пространства (ASLR) отключена, будет ли у нас детерминированный mmap?

Если ваше приложение имеет точно такую ​​же структуру памяти в момент i-го mmap (с точки зрения того, какие страницы виртуального адресного пространства отображаются, а какие нет);тогда mmap должен быть детерминированным в ядре Linux.

Возможны некоторые странные ситуации, которые могут изменить структуру памяти.Например, дополнительные аргументы командной строки могут сдвигать стек по более низкому адресу.Существует много файлов, созданных в среде исполнения c (например, локали), и если размер некоторых файлов изменился по сравнению с предыдущим запуском, компоновка памяти также будет изменена.Даже потребление стека может повлиять на это.

Если распределение памяти вашего приложения (как размеры, так и порядок размещения) через malloc изменилось, mmap не будет детерминированным.Итак, если ваше приложение является многопоточным;это должно исправить порядок вызовов malloc или ограничить все malloc для основного потока.

мм / mmap.c: arch_get_unmapped_area - нефиксированный распознаватель адресов mmap по умолчанию является детерминированным IIF дерево VMA такое же, И история предыдущего mmap такая же (имеется кэш mm->free_area_cache который живёт между вызовами в mmap.

4 голосов
/ 15 января 2012

По моему опыту это воспроизводимо. Когда у меня есть детерминированная программа (написанная мной) (с отключенной ASLR), которую я запускаю несколько раз (с одними и теми же входами и условиями) в gdb, указатели остаются теми же.

Тем не менее, быть детерминированной программой - это свойство, которое не может быть обнаружено статически (я просто знаю, что некоторые программы, которые я кодирую, достаточно детерминированы).

2 голосов
/ 15 января 2012

Возможно, ядро ​​несколько раз переназначит один и тот же адрес виртуальной памяти. Тем не менее, я не буду зависеть от ядра, которое будет указывать вам один и тот же адрес каждый раз, потому что это не обязательно. Если вам нужен фиксированный адрес и ядро ​​должно разместить его в определенном месте в виртуальной памяти, используйте MAP_FIXED.

...