Open Group标准说应该使用页面对齐的地址调用munmap,但似乎没有要求mmap应该返回页面对齐的地址。当您编写可移植代码时,这是否需要处理?
答案 0 :(得分:2)
mmap只会映射整个页面,因此只能返回页面边界。它在简短描述中:
mmap - 映射内存的页面
(强调我的)
答案 1 :(得分:1)
mmap文档确实提到了这个要求,尽管是以非专业的方式。在我的Mac上,例如:
[EINVAL] The offset argument was not page-aligned based on the
page size as returned by getpagesize(3).
http://pubs.opengroup.org/onlinepubs/009695399/functions/mmap.html也说
[EINVAL] addr参数(如果指定了MAP_FIXED)或off不是sysconf()返回的页面大小的倍数,或者被实现视为无效。
答案 2 :(得分:0)
我认为这是最自然的安排(也就是说,当物理和虚拟地址具有相同的页面粒度和对齐时)。页面转换的整个目的是将虚拟地址空间分解为跨度并将它们独立地映射到物理内存块(页面)上,其中1个跨度恰好覆盖1个块(页面)。即使是混合大小的页面,对齐也会自然保留(例如,常规页面= 4KB,大页面= x86 / 64上的2GB / 4GB; some illustrations)。
答案 3 :(得分:-1)
如果我理解正确,如果未指定MAP_FIXED,则mmap的行为取决于实现。因此,使用mmap的唯一可移植方式是使用MAP_FIXED,这意味着您必须提供页面对齐的地址。否则你会收到EINVAL。