Почему mmap() использует MAP_FAILED вместо NULL?

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

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

1 ответ

Решение

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

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

Другие вопросы по тегам