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

Met*_*est 9 c linux gcc mmap x86-64

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

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

实际上我想要的只是保留虚拟内存地址而不是分配实际的物理内存.可以使用带有MAP_NORESERVE的mmap完成吗?如果我想使用任何物理内存,我会使用MAP_FORED再次在地址范围内使用MAP_NORESERVE通过mmap分配的地址范围内.

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

fge*_*fge 6

使用普通的就可以了mmap()。任何实现 mmap 的足够现代的操作系统(即过去,什么,1995 年?)也实现了需求分页,并且只有在实际写入时才会保留页面。

  • 在保留您可能永远不需要的推测虚拟内存时,不使用 MAP_NORESERVE 对于在 OpenVZ VPS 上运行软件或任何其他内存计算损坏的蹩脚隔离/虚拟化软件的人来说,这是一个肯定会破坏事情的方法。 (2认同)

wil*_*ser 6

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

mmap()实际上做的是:

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

上述步骤中的许多(3个中的3个)是可选的,并且取决于mmap()调用中提供的实际参数和标志.(fd可能为-1:创建匿名映射,start-adress可能为NULL:mmap应分配(先前)未使用的内存范围)

在调用mmap()之后,内核中的pagefault-handler应该能够找到要做的事情.(将物理ram附加到页面;刷新和分离;分配和COW,......)

保留交换空间意味着调用者信任将来任何时候都有足够的交换空间.交换空间由所有进程共享,因此永远不能保证有足够的空间.预分配它(或多或少)可以保证调用进程总是足够的.(当不是:mmap()应该失败)