mmap和munmap的行为

5

The Open Group标准指出munmap应该使用页面对齐的地址,但似乎没有要求mmap返回页面对齐的地址。在编写可移植代码时,这是需要处理的吗?


2
我认为你可以假设mmap返回的地址已经适当地对齐了,我认为munmap的要求是为了防止你计算先前映射范围的子集而取消映射。不过我找不到任何证据来支持我的说法。 - CB Bailey
1
在某个地方(也许是在PAGE_SIZE的定义中?)POSIX提到,如果没有对齐限制,实现可以(并且可能应该)将页面大小定义为1。 - R.. GitHub STOP HELPING ICE
你应该阅读mmap的完整文档 -- 请查看我的回复。 - Foo Bah
4个回答

2

mmap只能映射整页内存,因此只能返回页面边界。这在简短的描述中已经说明:

mmap - 映射内存页

(强调是我的)


1
尽管如此,您会认为他们可以在正文中提及它。 - onemasse

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] 如果指定了MAP_FIXED,则addr参数(或off)不是sysconf()返回的页面大小的倍数,或被实现视为无效。


我不认为这意味着mmap应该总是返回页面对齐的地址。它只指定了特定参数的要求。你可能会假设由mmap返回的地址是页面对齐的,但是当你想编写可移植的代码时,最好确定一下。 - onemasse
@onemasse 那里有更多的限制--阅读整个讨论和EINVAL错误条件。 - Foo Bah

0

我认为这是最自然的安排(也就是说,当物理地址和虚拟地址具有相同的页面粒度和对齐方式时)。页面转换的整个目的是将虚拟地址空间分成跨度,并将它们独立地映射到物理内存块(页面)上,其中一个跨度恰好覆盖1个块(页面)。即使使用混合大小的页面,对齐方式也会自然保留(例如,在x86/64上,常规页面=4KB,大页面=2GB / 4GB;some illustrations)。


-1
如果我理解正确的话,如果没有指定MAP_FIXED,mmap的行为就取决于实现。因此,使用mmap的唯一可移植方式是使用MAP_FIXED,这意味着您必须提供一个页面对齐的地址。否则,您将收到EINVAL错误。

1
事实上,这是完全相反的:要使用MAP_FIXED,您必须了解地址空间布局。如果没有使用MAP_FIXED,您不知道操作系统将在哪里放置内存映射,但您不应需要了解,就像您不需要知道malloc将放置下一个分配的位置一样。 - zwol
但是如果我不指定MAP_FIXED,实现可以自由选择使用addr参数,并且没有要求返回的内存应该是页面对齐的。因此,在对其进行munmap之前,我需要检查返回的地址是否为页面对齐吗? - onemasse
不,您可以假设地址已对齐到页面。如果标准不要求mmap成功返回的地址是munmap可接受的参数,则这是一个疏忽而不是实际上需要您担心的事情。 - zwol

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