mmap() возвращает EINVAL

Я не могу заставить работать функцию mmap. Он возвращает код ошибки EINVAL.

void* mapped = 
        mmap((void*)(map_addr + slide),
             map_size,
             PROT_WRITE | PROT_READ,
             MAP_PRIVATE | MAP_ANON,
             bprm->file,
             map_offset);

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

 [EINVAL]           MAP_FIXED was specified and the addr argument was not page
                    aligned, or part of the desired address space resides out of the
                    valid address space for a user process.

MAP_FIXED не указан, так что это не так.

 [EINVAL]           flags does not include either MAP_PRIVATE or MAP_SHARED.

MAP_PRIVATE присутствует.

 [EINVAL]           The len argument was negative.

Аргумент len (map_size) во время вызова равен 8192.

 [EINVAL]           The offset argument was not page-aligned based on the page size as
                    returned by getpagesize(3).

Аргумент смещения (map_offset) равен 0, поэтому он должен быть выровнен по странице. (может я ошибаюсь?)


person Kristina Brooks    schedule 10.04.2012    source источник
comment
С MAP_ANON некоторые реализации требуют, чтобы fd был равен -1. Может стоит проверить.   -  person Simon Elliott    schedule 10.04.2012
comment
@Simon Elliott Да, вы правы. Спасибо.   -  person Kristina Brooks    schedule 10.04.2012


Ответы (2)


Вы уверены, что прочитали первое описание? Его также можно прочитать как описание двух непересекающихся случаев:

  1. Была указана MAP_FIXED, а аргумент addr не был выровнен по страницам,
  2. или часть желаемого адресного пространства находится за пределами допустимого адресного пространства для пользовательского процесса.

если читать так, фактическое значение выражения map_addr + slide становится интересным.

person unwind    schedule 10.04.2012

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

person Pavan Manjunath    schedule 10.04.2012
comment
В качестве теста я попытался использовать NULL. Все еще возвращается EINVAL. - person Kristina Brooks; 10.04.2012
comment
@NickBrooks Можете ли вы протестировать PAGE_SIZE в своей системе? - person Pavan Manjunath; 10.04.2012