Распределяет ли mmap страницу или часть страницы?

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

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

2 ответа

Решение

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

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

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

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

Да.

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

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

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

Источник: POSIX

Другие вопросы по тегам