mmap()返回EINVAL。

5

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

1
使用MAP_ANON时,某些实现要求fd为-1。值得检查。 - Simon Elliott
@Simon Elliott 是的,你说得对。谢谢你。 - Kristina Brooks
2个回答

2

你对第一个描述的理解确定吗?它也可以被理解为描述了两种不相关的情况:

  1. 指定了MAP_FIXED并且addr参数未对齐页面,
  2. 或者所需地址空间的一部分超出了用户进程的有效地址空间。

如果按照这种方式阅读,则 map_addr + slide 表达式的实际值变得有趣。


0
我建议在`addr`参数中使用`NULL`,并且完全让实现自由地放置你的`mmaped`区域(因为你指定的地址可能与进程的地址空间不符),直到有充分的理由不这样做为止。

作为测试,我尝试使用NULL。仍然返回EINVAL - Kristina Brooks
@NickBrooks,你能在你的系统上测试一下PAGE_SIZE吗? - Pavan Manjunath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接