The Open Group标准指出munmap应该使用页面对齐的地址,但似乎没有要求mmap返回页面对齐的地址。在编写可移植代码时,这是需要处理的吗?
mmap只能映射整页内存,因此只能返回页面边界。这在简短的描述中已经说明:
mmap - 映射内存页
(强调是我的)
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] 如果指定了MAP_FIXED,则addr参数(或off)不是sysconf()返回的页面大小的倍数,或被实现视为无效。
我认为这是最自然的安排(也就是说,当物理地址和虚拟地址具有相同的页面粒度和对齐方式时)。页面转换的整个目的是将虚拟地址空间分成跨度,并将它们独立地映射到物理内存块(页面)上,其中一个跨度恰好覆盖1个块(页面)。即使使用混合大小的页面,对齐方式也会自然保留(例如,在x86/64上,常规页面=4KB,大页面=2GB / 4GB;some illustrations)。
MAP_FIXED
,您必须了解地址空间布局。如果没有使用MAP_FIXED
,您不知道操作系统将在哪里放置内存映射,但您不应需要了解,就像您不需要知道malloc
将放置下一个分配的位置一样。 - zwolmmap
成功返回的地址是munmap
可接受的参数,则这是一个疏忽而不是实际上需要您担心的事情。 - zwol
mmap
返回的地址已经适当地对齐了,我认为munmap
的要求是为了防止你计算先前映射范围的子集而取消映射。不过我找不到任何证据来支持我的说法。 - CB BaileyPAGE_SIZE
的定义中?)POSIX提到,如果没有对齐限制,实现可以(并且可能应该)将页面大小定义为1。 - R.. GitHub STOP HELPING ICE