一尘不染

MAP_NORESERVE的mmap是否保留物理内存?

linux

MMAP文件说,下面讲的标志MAP_NORESERVE。

不要为该映射保留交换空间。当保留交换空间时,可以保证可以修改映射。如果没有保留交换空间,则在没有物理内存可用的情况下,可能会在写入时获得SIGSEGV。

我真正想要的只是保留虚拟内存地址,而没有分配实际的物理内存。可以使用MAP_NORESERVE的mmap来完成此操作吗?如果我想使用任何物理内存,我将在MAP_NORESERVE通过mmap分配的地址范围内,再次使用MAP_FIXED对其进行映射。

总而言之,我希望内核不为带有MAP_NORSERVE标志的mmap分配的内存保留任何物理页。它是否真的像这样工作,或者如果内核具有足够的物理内存,内核是否会分配物理页面?


阅读 583

收藏
2020-06-02

共1个答案

一尘不染

Mmap()是管理{地址,物理内存,磁盘块}之间的关联的方法之一,该关联的所有三个成员都是资源。关联保存在页面表项(PTE)中

mmap()的实际作用是:

  • [也许]在用户进程内部分配一个地址范围。此范围必须包含连续的地址(不应与现有范围重叠)
  • 为请求的范围创建PTE,并使它们指向地址范围内的页面
  • 将PTE指向要进行mmap()处理的文件
  • [也许]分配和预取(某些)页面
  • [也许]保留一些后备存储。

上述步骤中有很多(5之3)是可选的,并取决于mmap()调用中提供的实际参数和标志。(fd可能为-1:创建匿名映射,起始地址可能为NULL:mmap应该分配(以前)未使用的内存范围)

调用mmap()之后,内核中的pagefault-handler应该能够找出要做什么。(将物理内存附加到页面上;刷新并分离;分配并COW,…)

保留交换空间意味着调用方相信 将来任何时候
都将有足够的交换空间。交换空间由所有进程共享,因此永远不能保证有足够的交换空间。预分配它(或多或少)可确保 调用过程
将始终具有足够的分配量。(否则:mmap()应该失败了)

2020-06-02