【问题标题】:alignment and granularity of mmapmmap的对齐和粒度
【发布时间】:2025-12-01 06:15:03
【问题描述】:

我被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 是否总是 pagesize 的倍数(粒度就是 pagesize)?

感谢您的帮助。

我认为这一段暗示了:

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

但我不确定,我在 POSIX 方面没有太多经验。

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

谢谢阿甘。

【问题讨论】:

    标签: c memory posix alignment mmap


    【解决方案1】:

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

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

    然而,对于 MMAP_ANONYMOUS,内存可能是可写的——但同样,使用该内存是不明智的。

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

    【讨论】: