Я смущен спецификацией mmap.
Позволить pa
будьте обратным адресом mmap (то же как спецификация)
pa = mmap (addr, len, протестант, флаги, fildes, прочь);
По-моему, после вызова функции успешно выполняются, следующий диапазон допустим
[pa, pa+len)
Мой вопрос состоит в том, допустим ли диапазон следующего все еще?
[round_down (pa, размер страницы), round_up (pa+len, размер страницы))
[основа, основа + размер], если коротко,
То есть:
base
всегда выравниваемый на границе страницы?size
всегда несколько из размера страницы (гранулярность является размером страницы, другими словами)?Спасибо за помощь.
Я думаю, что это подразумевается в этом абзаце:
От аргумента вынужден быть выровненный и быть измеренными согласно значению, возвращенному sysconf () при передаче _SC_PAGESIZE или _SC_PAGE_SIZE. Когда MAP_FIXED будет указан, приложение должно гарантировать, что аргумент addr также встречает эти ограничения. Реализация выполняет операции отображения по целым страницам. Таким образом, в то время как аргумент len не должен встречать размер или ограничение выравнивания, реализация должна включать, в любой операции отображения, любая частичная страница, указанная диапазоном [pa, pa+len).
Но я не уверен, и у меня нет большого опыта в POSIX.
Спасибо agian.
Ваш вопрос довольно открытый, учитывая, что mmap имеет много различных режимов и конфигураций, но я постараюсь осветить наиболее важные моменты.
Возьмем случай, когда вы отображаете файл в память. Начало данных в файле всегда будет корнем по адресу возврата mmap (). Хотя операционная система могла фактически создавать карты на границах страниц, я не верю, что стандарт POSIX требует, чтобы ОС делала эту память доступной для записи (например, она могла бы вызвать сбои сегментов в этих областях, если бы захотела). В случае файлов сопоставления не имеет смысла, чтобы эти дополнительные области адресов памяти поддерживались файлом , более разумно, чтобы эти области были неопределенными.
Однако для MMAP_ANONYMOUS память, вероятно, доступна для записи, но, опять же, было бы неразумно использовать эту память.
Вдобавок, когда вы используете mmap (), вы фактически используете версию mmap () glibc, и она может разрезать и нарезать память так, как сочтет нужным. Наконец, стоит отметить, что в OSX, совместимой с POSIX, ни один из представленных вами цитируемых текстов не появляется на странице руководства для mmap ().