【发布时间】:2017-02-15 08:36:05
【问题描述】:
最近在一次采访中,有人问我mmap是否可以直接以二进制模式对程序进行映射;没有页面参考。
我认为这是不可能的,因为它
允许应用程序将文件映射到内存中,这意味着有 一个内存地址和一个字之间的一一对应关系 文件。然后程序员可以直接通过内存访问文件, 与任何其他内存驻留数据块相同——甚至 可以允许对内存区域的写入透明地映射 回到磁盘上的文件
在不涉及分页的情况下访问文件听起来是错误的。
我仍然想知道 mmap 是否可以通过页面方式以外的任何其他方式将文件映射到内存中。
=====
the page way
=====
页面是最小的内存单元,可以有不同的 权限和行为。因此,页面是构建块 内存映射,这反过来又是构建块 进程地址空间。 mmap() 系统调用在页面上运行。两个都 addr 和 offset 参数必须在页面大小上对齐 边界。也就是说,它们必须是页面大小的整数倍。
因此,映射是页面的整数倍。如果 调用方提供的 len 参数未在页面上对齐 边界——可能是因为底层文件的大小不是倍数 页面大小——映射向上舍入到下一整页
【问题讨论】:
-
映射文件的页面方式是什么?
-
@Marian 添加了问题。
-
对我来说这个
mapping of the program in binary mode directly; without page reference很不清楚。 -
在“旧时代”(32 位)中,分段可以用作(或连同)分页来创建文件映射的替代方法(但是 linux mmap() 不支持) .这甚至是字节粒度。但是 x86_64 很大程度上放弃了对此的支持。
标签: c memory-management mmap