mmap的对齐和粒度

时间:2010-05-01 11:22:46

标签: c memory posix alignment mmap

我对specification of 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总是页面大小的倍数(换句话说,粒度是页面大小)?
  3. 感谢您的帮助。

    我认为这段暗示:

      

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

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

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

    非常感谢。

1 个答案:

答案 0 :(得分:3)

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

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

对于MMAP_ANONYMOUS,内存很可能是可写的 - 但是,再次使用这个内存是不明智的。

此外,当您使用mmap()时,您实际上正在使用glibc的mmap()版本,并且它可能会在它认为合适的情况下对内存进行切片和切块。最后,值得注意的是,在符合POSIX的OSX上,您提供的引用文本都没有出现在mmap()的手册页中。