Я искал разные флаги для функции mmap, а именно MAP_FIXED, MAP_SHARED, MAP_PRIVATE. Может ли кто-нибудь объяснить мне цель MAP_FIXED? Нет гарантии, что адресное пространство будет использоваться в первую очередь.Когда можно было использовать mmap map_fixed
ответ
MAP_FIXED
является dup2
для отображения памяти, и это полезно в одних и тех же ситуациях, когда dup2
полезно для дескрипторов файлов: если вы хотите, чтобы выполнить заменить операцию атомарной переназначение идентификатор ресурса (диапазон памяти в случае MAP_FIXED
, или fd в случае dup2
), чтобы ссылаться на новый ресурс без возможности расы, где он мог бы переназначить что-то еще, если вы сначала выпустили старый ресурс, а затем попытались восстановить его для нового ресурса.
В качестве примера загрузите общую библиотеку (с помощью динамического загрузчика). Он состоит, по меньшей мере, из трех типов сопоставлений: read + exec-only отображение кода программы и данных только для чтения из исполняемого файла, чтение и запись сопоставления инициализированных данных (также из исполняемого файла, но обычно с другим относительное смещение) и анонимная память с нулевой инициализацией с чтением и записью (для .bss
). Создание их в виде отдельных сопоставлений не сработало бы потому, что они должны быть фиксированными относительными адресами относительно друг друга. Поэтому вместо этого вы сначала создаете фиктивное сопоставление общей требуемой длины (тип этого сопоставления не имеет значения) без MAP_FIXED
, чтобы зарезервировать достаточный диапазон смежных адресов в назначенном для ядра месте, затем вы используете MAP_FIXED
для отображения сверху частей этого диапазона по мере необходимости с тремя или более сопоставлениями, которые необходимо создать.
Кроме того, обратите внимание, что использование MAP_FIXED
с жестким кодом или случайным адресом - всегда ошибка. Единственный правильный способ использования MAP_FIXED
- заменить существующее сопоставление, адрес которого был присвоен предыдущим успешным звонком до mmap
без MAP_FIXED
, или каким-либо другим способом, когда вы считаете безопасным заменять целые страницы. Этот аспект тоже полностью аналогичен dup2
; всегда есть ошибка для использования dup2
, когда у вызывающего абонента еще нет открытого файла на целевом fd с намерением его заменить.
Если файл, который вы загружаете, содержит указатели, вам необходимо загрузить его в определенное место, чтобы убедиться, что указатели верны. В некоторых случаях это может быть просто оптимизация.
Исполняемые файлы, не зависящие от положения, должны быть загружены с фиксированными адресами.
Общая память может содержать указатели.
Исполняемые файлы, которые используют предварительную привязку, будут пытаться загружать динамические библиотеки в определенные ячейки памяти в качестве оптимизации, но при использовании другого места (или если библиотека была изменена) будут возвращаться к обычным методам загрузки.
Так что MAP_FIXED
не является типичным использованием.
Я не думаю, что это отвечает на вопрос о том, когда использовать его вообще. –
@R ..: Вы правы. Я полностью забыл о переделке. –