выравнивание и гранулярность mmap

Я смущен спецификацией mmap.

Позволить pa будьте обратным адресом mmap (то же как спецификация)

pa = mmap (addr, len, протестант, флаги, fildes, прочь);

По-моему, после вызова функции успешно выполняются, следующий диапазон допустим

[pa, pa+len)

Мой вопрос состоит в том, допустим ли диапазон следующего все еще?

[round_down (pa, размер страницы), round_up (pa+len, размер страницы))
[основа, основа + размер], если коротко,

То есть:

  1. base всегда выравниваемый на границе страницы?
  2. size всегда несколько из размера страницы (гранулярность является размером страницы, другими словами)?

Спасибо за помощь.

Я думаю, что это подразумевается в этом абзаце:

От аргумента вынужден быть выровненный и быть измеренными согласно значению, возвращенному sysconf () при передаче _SC_PAGESIZE или _SC_PAGE_SIZE. Когда MAP_FIXED будет указан, приложение должно гарантировать, что аргумент addr также встречает эти ограничения. Реализация выполняет операции отображения по целым страницам. Таким образом, в то время как аргумент len не должен встречать размер или ограничение выравнивания, реализация должна включать, в любой операции отображения, любая частичная страница, указанная диапазоном [pa, pa+len).

Но я не уверен, и у меня нет большого опыта в POSIX.

  • Приведите мне некоторое более явное и более категорическое доказательство
  • Или покажите мне по крайней мере одну систему, которая поддерживает POSIX и имеет другое поведение

Спасибо agian.

8
задан OwnWaterloo 1 May 2010 в 11:28
поделиться

1 ответ

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

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

Однако для MMAP_ANONYMOUS память, вероятно, доступна для записи, но, опять же, было бы неразумно использовать эту память.

Вдобавок, когда вы используете mmap (), вы фактически используете версию mmap () glibc, и она может разрезать и нарезать память так, как сочтет нужным. Наконец, стоит отметить, что в OSX, совместимой с POSIX, ни один из представленных вами цитируемых текстов не появляется на странице руководства для mmap ().

3
ответ дан 6 December 2019 в 00:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: