2011-12-23 8 views
2

Надеемся, что титул ясно. У меня есть кусок памяти, полученный через mmap(). Через некоторое время я пришел к выводу, что мне больше не нужны данные в этом диапазоне. Однако я все же хочу сохранить этот диапазон. То есть, я не хочу вызывать mummap(). Я стараюсь быть хорошим гражданином и не заставлять систему менять больше, чем нужно.Как сообщить Linux, что страницу mmap() 'd не нужно записывать для замены, если необходима физическая страница резервной копии?

Есть ли способ, чтобы сообщить ядру Linux, что если данная страница подкреплено физической страницы и если ядро ​​решает это необходимо, что физическая страница, не мешай писать эту страницу, чтобы поменять местами?

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

+0

Что случилось с munmap? Он делает именно то, что вы говорите, чего хотите. Если вы хотите, чтобы более поздний mmap не использовал один и тот же виртуальный адрес, вы могли бы mmap с MAP_FIXED + PROT_NONE после munmap, чтобы зарезервировать адреса ... –

+0

Откуда вы знаете, что это делает (записывает резервную физическую страницу для обмена)? –

+0

@ChrisDodd Я мог использовать munmap() только в том случае, если бы я мог гарантировать, что последующий вызов mmap(), сделанный с соответствующими параметрами, будет повторять одну и ту же страницу. Именно этот недостаток гарантии заключается в том, что второй mmap() преуспеет, что мешает мне использовать munmap(). Важно, чтобы начало и конец моего куска памяти не менялись, даже если я знаю, что в разные моменты больше страниц не содержат полезных данных. – tgoodhart

ответ

5

Ваш вопрос (как указано) не имеет смысла.

Предположим, что существует способ сообщить ядру, что вы хотите.

Предположим также, что это нужна дополнительная оперативная память, поэтому она забрала вашу страницу и не заменила ее.

Теперь ваша программа пытается прочитать эту страницу (так как вы не хотели получать munmap данные, предположительно вы можете могли бы попытаться получить к нему доступ). Что ядро ​​делать? Варианты, которые я вижу:

  1. он может дать вам новую страницу, заполненную 0s.
  2. он может дать вам SIGSEGV

Если вы хотите выбор 2, вы могли бы достичь того же результата с munmap.

Если вы хотите выбрать 1, вы могли бы mremap по существующему картографированию с MAP_ANON (или munmap, а затем новым mmap).

В любом случае вы не можете зависеть от старых данных, когда они вам нужны.

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

EDIT:

Вы могли бы искать madvise(..., MADV_DONTNEED)

+0

Отлично! madvise() именно то, что я искал. Поведение вроде (1) - это то, что я хотел бы, хотя нулевое заполнение не нужно. Любой мусор будет делать. Имеет ли mremap() флаг MAP_ANON в вашей системе? В моей документации этого нет. – tgoodhart

0

Вы можете munmap область, затем mmap его снова с MAP_NORESERVE

Если вы знаете, в начальный момент времени отображения, что замена не нужна, используйте MAP_NORESERVE

+0

Нет гарантии, что второй mmap() будет успешным. – tgoodhart

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

  • Нет связанных вопросов^_^