Mmap выделяет страницу или часть страницы?

Я в замешательстве, делает mmap выделить целую страницу памяти (независимо от указанного размера), или она просто выделяет размер, который вы запрашиваете? Действительно, мне любопытно, что происходит при последующих звонках mmap — выделит ли второй вызов новую страницу (даже если оба вызова используют сумму ниже размера страницы) или он выделит блок, смежный с предыдущим вызовом?

То же самое для mprotect — это защищает всю страницу или только указанную часть?

4

Решение

Если аргумент длины не кратен размеру страницы, он будет округлен до кратного размера страницы.

Как следствие, ответ на ваш вопрос — да mmap() виртуально выделяет только целые страницы.

относительно mprotect() на странице man четко ответьте на ваш вопрос:

mprotect () изменяет защиту страниц памяти вызывающего процесса
содержащий любую часть диапазона адресов в интервале [addr,
адр + LEN-1]. Адрес должен быть выровнен по границе страницы.

5

Другие решения

Да.

Но это не из-за mmap как таковой, это потому, что ядро ​​не может сделать что-то другое. Память организована по страницам, и MMU «мыслит» в терминах страниц, поэтому нет никакого способа (в любом случае, разумного, разумного способа) выделить половину страницы и передать другую половину кому-то еще.
Как бы, например, предотвратить процесс 2 от кражи конфиденциальных данных из процесса 1, если каждый из них выделил половину страницы? Система защиты памяти не работает таким образом, было бы невозможно предотвратить это.

mmap предписывает, чтобы длина была ненулевой, или она потерпит неудачу. Кроме этого, он не имеет требований к входным параметрам (кроме противоречивых флагов), но, конечно, реализация всегда позволил чтобы вызов не удался по другим причинам, по его усмотрению (здесь термин «реализация» означает, например, «Linux»).

Эффективный адрес сопоставления (который будет возвращен при успешном вызове mmap) — это определяемая реализацией функция адресной подсказки. Практически это означает округление подсказки вниз до предыдущей страницы (обычно 4096 байт) границы и округления длины вверх до границы следующей страницы.
Различные версии Linux ведут себя по-разному в некоторых диапазонах адресов, например, до версии 2.6, подсказки ниже mmap_min_addr потерпит неудачу с EINVAL тогда как теперь он округляет адрес, чтобы он действовал.

Источник: POSIX

7

По вопросам рекламы [email protected]