mmap()返回EINVAL

时间:2012-04-10 12:38:21

标签: c mmap

我无法使用 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,因此必须进行页面对齐。 (也许我错了?)

2 个答案:

答案 0 :(得分:2)

您确定阅读第一个描述吗?它也可以理解为描述两个不相交的情况:

  1. 指定了MAP_FIXED,并且addr参数没有页面对齐,
  2. 或部分所需地址空间位于用户进程的有效地址空间之外。
  3. 如果这样读,map_addr + slide表达式的实际值就会变得有趣。

答案 1 :(得分:0)

我建议您使用NULL作为addr参数,并让实施完全自由地放置您的mmaped区域(因为您指定的地址可能会因此而异常“地址空间”,直到有严重的理由不这样做。