【问题标题】:Does mmap return aligned pointer valuesmmap 是否返回对齐的指针值
【发布时间】:2017-07-04 17:03:52
【问题描述】:

mmap() 是否保证返回值与系统上的最大对齐方式对齐?即 POSIX 标准是否保证 mmap 必须返回 alignof(std::max_align_t) 的倍数的指针值?

我无法在 Ubuntu linux mmap(2) 手册页或 mac osx mmap(2) 手册页上找到此信息

【问题讨论】:

  • 我不知道它是否有保证,但由于它有硬件功能支持,如果没有,我会感到非常惊讶。
  • this link 可能会有所帮助。 Quoated:相比之下,mmap 返回的地址只保证页面对齐。
  • @felix munmap() 的手册页上写着The addr parameter was not page aligned (i.e., a multiple of the page size).,这意味着我无法释放未在页面边界上对齐的内存,并且由于页面边界大于最大对齐,我在指针未在最大对齐上对齐的情况下将无法调用munmap()

标签: c++ alignment mmap


【解决方案1】:

是的。

http://man7.org/linux/man-pages/man2/mmap.2.html

在大多数“流行” NULL 映射的情况下

如果 addr 为 NULL,那么内核会选择地址 创建映射;这是创建一个新的最便携的方法 映射。如果 addr 不为 NULL,则内核将其作为提示 关于放置映射的位置; 在 Linux 上,映射将是 在附近的页面边界处创建。新映射的地址是 作为调用的结果返回。

即使你指定 MAP_FIXED 比

不要将 addr 解释为提示:将映射准确地放在那个位置 地址。 addr 必须是页面大小的倍数。如果记忆 addr 和 len 指定的区域与任何现有的页面重叠 映射,则现有映射的重叠部分将 被丢弃。如果指定的地址不能使用,mmap() 将 失败。因为需要固定地址进行映射较少 便携,不鼓励使用此选项。

考虑到最小页面是 4096B(对于 x86,但对于其他平台,无论如何它是 1024B 的倍数),因为 std::max_align_t 在 64 位系统上最有可能是 16B,它将被对齐。

【讨论】:

  • 如果您提供零偏移量,这将成立。如果您提供未对齐的偏移量,您将得到一个未对齐的地址(即,奇数偏移量会给您一个奇数地址)。这是在 Linux 上观察到的。
猜你喜欢
  • 2020-01-16
  • 1970-01-01
  • 1970-01-01
  • 2016-07-07
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多