Mmap с MAP_NORESERVE резервирует физическую память? - PullRequest
8 голосов
/ 14 декабря 2011

Документация mmap гласит следующее о флаге MAP_NORESERVE.

Не резервируйте место подкачки для этого сопоставления. Когда пространство подкачки защищены, есть гарантия, что возможно изменить отображение. Когда пространство подкачки не зарезервировано, можно получить SIGSEGV при напишите, если физической памяти нет.

На самом деле я хочу зарезервировать только адреса виртуальной памяти и не выделять фактическую физическую память. Можно ли это сделать с помощью mmap с помощью MAP_NORESERVE? Если я хочу использовать какую-либо физическую память, я бы снова отобразил ее с помощью MAP_FIXED в диапазоне адресов, который был выделен через mmap с помощью MAP_NORESERVE.

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

Ответы [ 3 ]

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

Mmap () - это один из способов управления связью между {адрес, физическая память, дисковые блоки}. Все три члена этой ассоциации являются ресурсами.Ассоциация сохраняется внутри записей таблицы страниц (PTE)

Что фактически делает mmap ():

  • [возможно] выделяет диапазон адресов внутри пользовательского процесса.Этот диапазон должен состоять из последовательных адресов (не должен перекрываться с существующими диапазонами)
  • создавать PTE для запрошенного диапазона и заставлять их указывать на страницы в пределах диапазона адресов
  • заставлять PTE указывать нафайл mmap () ed
  • [может быть] выделить и предварительно извлечь (некоторые) страницы
  • [возможно] зарезервировать некоторое резервное хранилище.

Многие (3 изиз 5) вышеупомянутые шаги являются необязательными и зависят от фактических аргументов и флагов, предоставленных в вызове mmap ().(fd может быть -1: создание анонимного отображения, начальный адрес может быть NULL: mmap должен выделять (ранее) неиспользованный диапазон памяти)

После вызова mmap (), pagefault-Обработчик внутри ядра должен уметь выяснять, что делать.(прикрепить физический оперативный диск к странице; очистить и отсоединить; выделить и COW, ...)

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

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

Просто используйте обычный mmap(). Любая достаточно современная ОС (т. Е. Прошлая, какая, 1995?), Которая реализует mmap, также реализует разбиение на страницы по требованию, и страницы будут зарезервированы только в том случае, если вы на них действительно пишете.

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

В linux mmap настраивает только сопоставления виртуальной памяти, независимо от того, используете вы MAP_NORESERVE или нет, физическая память не назначается, пока вы не коснетесь памяти.

MAP_FIXED не связан с этим, он устанавливает сопоставления виртуальной памяти по указанному вами виртуальному (не физическому) адресу или завершается ошибкой, если для этого адреса нет места для сопоставления по этому адресу.

...