2014-07-03 3 views
6

Кто-нибудь знает, почему mmap() возвращает MAP_FAILED вместо NULL? Кажется, что MAP_FAILED (void *) - 1 на большинстве систем. Почему вместо mmap() вместо этого используется NULL? Я знаю, что адрес 0x0 является технически допустимой страницей памяти, тогда как (void *) - 1 никогда не будет действительной страницей. Однако я предполагаю, что mmap() никогда не вернет страницу 0x0 на практике. В Windows, например, VirtualAlloc() возвращает NULL при ошибке.Почему mmap() использует MAP_FAILED вместо NULL?

Можно ли предположить, что mmap() никогда не вернет 0x0? Предположительно, успешный вызов mmap() должен вернуть полезную память вызывающему абоненту. Адрес 0x0 никогда не используется, поэтому он никогда не должен возвращаться после успеха. Это обстоятельство сделало бы разумным использовать 0x0 как провал-неудачу, поэтому я озадачен существованием MAP_FAILED в первую очередь.

ответ

6

Есть несколько редких ситуаций, когда mmap() фактически создаст сопоставление по адресу 0x0. В наши дни обычно требуются привилегии root (или для sysctl mmap_min_addr, которые должны быть установлены на ноль в системах Linux), но это возможно. Если такое отображение создано, становится возможным писать на этот адрес.

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

+0

Это очень интересно о mmap_min_addr. Похоже, что в некоторых случаях вы действительно можете запросить сопоставление с адресом 0x0. Учитывая это, позвольте мне уточнить мой вопрос. Я спросил, будет ли mmap() когда-либо возвращать NULL на практике, но я действительно хотел спросить, будет ли когда-либо возвращаться вызов MAP_ANON, например mmap (NULL, размер, флаги, MAP_ANON | MAP_PRIVATE, -1, 0) null на практике. Это мой фактический прецедент, так что мне действительно интересно. –

+1

Нет, 'mmap()' никогда не вернет отображение по этому адресу, если вы не попросите его с помощью MAP_FIXED. – duskwuff

+0

@duskwuff Я уверен, что вы правы, но у вас есть источник для этого? – Guido

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