我无法使用 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,因此必须进行页面对齐。 (也许我错了?)
答案 0 :(得分:2)
您确定阅读第一个描述吗?它也可以理解为描述两个不相交的情况:
如果这样读,map_addr + slide
表达式的实际值就会变得有趣。
答案 1 :(得分:0)
我建议您使用NULL
作为addr
参数,并让实施完全自由地放置您的mmaped
区域(因为您指定的地址可能会因此而异常“地址空间”,直到有严重的理由不这样做。