Всегда ли mmap возвращает более высокий адрес - PullRequest
0 голосов
/ 14 декабря 2011

Всегда ли mmap (при вызове с MAP_ANONYMOUS, то есть для выделения памяти) всегда возвращает более высокий адрес памяти, чем предыдущий вызов? Если нет, то есть ли способ заставить его всегда возвращать более высокий адрес?

Ответы [ 2 ]

3 голосов
/ 14 декабря 2011

Не обязательно, по крайней мере, не в соответствии с его определением.

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

Очевидно, что на 32-битных процессорах (и ядрах) пространство памяти может быть почти заполнено, поэтому при запросе большого mmap -го диапазона ядро ​​должно найти тот, который подходит,и это может быть где угодно.

Если вы хотите монотонное направление, используйте sbrk (но я действительно рекомендую не использовать его).

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

@ MetallicPriest: вы действительно должны мотивировать и объяснить гораздо больше своих вопросов.Там так загадочно и странно (и даже я не могу угадать весь контекст), что отвечать на них не очень весело.

3 голосов
/ 14 декабря 2011

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

Если вы хотите, чтобы возвращаемый адрес был тем, который вы указали, вы можете использовать MAP_FIXED флаг, но это не очень портативный и надежный.Таким образом, вы связываете свой код с конкретной реализацией mmap для конкретного ядра.

Но в любом случае, зачем вам всегда нужен более высокий адрес, чем предыдущий?Возможно, лучший способ изменить логику вашей программы.

...