2017-02-15 12 views
3

Выполняет ли mmap(), что возвращаемые значения выровнены с наибольшим выравниванием в системе? то есть гарантируется ли это стандартом POSIX, что mmap должен возвращать значения указателей, кратные alignof(std::max_align_t)?Соответствует ли mmap значениям выровненных указателей

Я не смог найти эту информацию либо на Linux Ubuntu ттар (2) человек страницы или Mac OSX ттар (2) человек страница

+0

Я не знаю, гарантировано ли это, но так как это подкреплено аппаратными возможностями, я был бы очень удивлен, если бы это не так. –

+0

[эта ссылка] (http://stackoverflow.com/questions/31411730/mmap-enforce-64k-alignment) может помочь. Quoated: адрес контраста, возвращенный mmap, гарантируется только выравниванием по странице. – felix

+0

@felix Страница man для 'munmap()' говорит 'Параметр addr не был выровнен по странице (т. Е. Кратно размеру страницы).', Что означает, что я не могу освободить память, которая не выровнена на границе страницы, и поскольку граница страницы больше, чем максимальное выравнивание, я не буду называть 'munmap()' в том случае, если указатель не выровнен по максимальному выравниванию – Curious

ответ

3

Да он делает.

http://man7.org/linux/man-pages/man2/mmap.2.html

В случае наиболее «популярных» NULL отображения

Если указан адрес NULL, то ядро ​​выбирает адрес, с которого создать отображение; это самый переносимый способ создания нового отображения . Если addr не является NULL, то ядро ​​принимает его как подсказку о том, где разместить сопоставление; на Linux, отображение будет , созданное на ближайшей границе страницы. Адрес нового сопоставления - , возвращенный в результате вызова.

Даже если вы уточнить MAP_FIXED чем

Не интерпретировать адрес как намек: место отображение точно, что адрес. addr должен быть кратным размеру страницы. Если область памяти , заданная с помощью addr и len, перекрывает страницы любых существующих сопоставлений , тогда перекрывающаяся часть существующих сопоставлений будет отбрасываться . Если указанный адрес не может быть использован, mmap() будет сбой. Поскольку для фиксированного адреса для сопоставления требуется меньше , использование этого параметра не рекомендуется.

Принимая тот факт, наименьшую страницы 4096B (для x86, но и для других платформ это кратно 1024b валиков в любом случае) и, как станд :: max_align_t, скорее всего, будут 1 на 64-битных системах будут выровненными.

Смежные вопросы