2015-02-18 2 views

ответ

9

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 с намерением его заменить.

2

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

  • Исполняемые файлы, не зависящие от положения, должны быть загружены с фиксированными адресами.

  • Общая память может содержать указатели.

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

Так что MAP_FIXED не является типичным использованием.

+1

Я не думаю, что это отвечает на вопрос о том, когда использовать его вообще. –

+0

@R ..: Вы правы. Я полностью забыл о переделке. –