LINUX.ORG.RU

munmap и странное

 , ,


0

2

Привет, ЛОР!

Я тут перерыл вагон доков и не могу понять одну штуку. В мануале к munmap написано следующее:

The address addr must be a multiple of the page size (but length need not be). All pages containing a part of the indicated range are unmapped <...>

Меня смущает пункт про то, что длина области не обязательно должна делиться нацело на размер страницы. Как это должно работать? Если я дёрну munmap на указатель в середине замапленной области с длиной 1, будет ли вся страница с этим адресом выдернута из адресного пространства? Является ли это поведение переносимым или это задвиг люникса? Чего вообще стоит ожидать в данном сценарии?

Спасибо, ЛОР!

★★★★★

Последнее исправление: hateyoufeel (всего исправлений: 2)

Ответ на: комментарий от Siborgium

Такой указатель не будет «a multiple of the page size».

Сорри, неправильно написал. В середину маппинга, который может быть из нескольких страниц. Поправил вопрос в посте.

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 1)

Если я дёрну munmap на указатель в середине замапленной области с длиной 1,

То есть в середине области длиной 1*PAGE_SIZE? Тогда указатель из середины области не будет кратен PAGE_SIZE.

… будет ли вся страница с этим адресом выдернута из адресного пространства?

Вы, скорее всего, имели в виду «будут ли возвращены системе все mmap()-нутые страницы, содержащие диапазон [address, address+length], где address кратен PAGE_SIZE, а lentgh – произвольное число >= 0?».

Кстати, из линуксового man следует, что munmap() должен сработать при правильном address, даже если length == 0 (upd: то есть удалить 1 страницу с начальным адресом address).

Про length != N*PAGE_SIZE есть в линуксовом man, в OpenBSD, например, нет.

Пример для проверки самому писать лень.

x22
()
Последнее исправление: x22 (всего исправлений: 1)
Ответ на: комментарий от x22

То есть в середине области длиной 1*PAGE_SIZE? Тогда указатель из середины области не будет кратен PAGE_SIZE.

Нет. Допустим, область имеет размер в три страницы и указатель указывает на начало второй.

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от hateyoufeel

Да, так и предположил выше. Если верить линуксовому man, то munmap(addr,len) удалит все mmap()-нутые процессом страницы, пересекающиеся с интервалом [addr,addr+len], если addr кратно размеру страницы.

x22
()