mmap的对齐和粒度

Own*_*loo 8 c memory posix mmap alignment

对mmap规范感到困惑.

pa是MMAP的返回地址(如说明书)

pa = mmap(addr,len,prot,flags,fildes,off);

在我看来,在函数调用成功后,以下范围是有效的

[pa,pa + len)

我的问题是以下范围是否仍然有效?

[round_down(pa,pagesize),round_up(pa + len,pagesize))
[base,base + size]简称

也就是说:

  1. base始终在页边界上对齐?
  2. size总是页面大小的倍数(粒度换句话说页大小)?

谢谢你的帮助.

我认为这段暗示:

参数被约束为根据由返回的值被对准和尺寸()的sysconf当传递_SC_PAGESIZE或_SC_PAGE_SIZE.指定MAP_FIXED时,应用程序应确保参数addr也满足这些约束.该实现在整个页面上执行映射操作.因此,虽然参数len不需要满足大小或对齐约束,但实现应在任何映射操作中包括由范围[pa,pa + len]指定的任何部分页面.

但我不确定,我对POSIX没有多少经验.

  • 请告诉我一些更明确和更确定的证据
  • 或者向我展示至少一个支持POSIX并具有不同行为的系统

谢谢agian.

Noa*_*ins 4

考虑到 mmap 有许多不同的模式和配置,您的问题是相当开放的,但我将尝试涵盖最重要的点。

以将文件映射到内存的情况为例。文件中数据的开头始终以 mmap() 的返回地址为根。虽然操作系统实际上可能在页面边界创建了映射,但我不认为 POSIX 标准要求操作系统使该内存可写(例如,如果愿意,它可以在这些区域上强制出现段错误)。在映射文件的情况下,文件支持的额外内存地址区域没有意义,这些区域未定义更有意义。

然而,对于 MMAP_ANONYMOUS,该内存可能是可写的——但是,再次强调,使用该内存是不明智的。

此外,当您使用 mmap() 时,您实际上使用的是 glibc 版本的 mmap(),并且它可能会以它认为合适的方式对内存进行切片和切块。最后,值得注意的是,在兼容 POSIX 的 OSX 上,您提供的任何引用文本都不会出现在 mmap() 的手册页中。