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

时间:2011-12-14 14:45:28

标签: c linux gcc x86-64 mmap

mmap文档说明了MAP_NORESERVE标志。

  

不要为此映射保留交换空间。当交换空间是   保留,一个保证可以修改   映射。当交换空间没有被保留时,可能会得到一个SIGSEGV   如果没有可用的物理内存则写入。

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

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

3 个答案:

答案 0 :(得分:6)

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

mmap()实际上是:

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

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

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

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

答案 1 :(得分:3)

在linux上,mmap只设置虚拟内存映射,无论是否使用MAP_NORESERVE,在触摸内存之前都不会分配物理内存。

MAP_FIXED与此无关,它在您指定的虚拟(非物理)地址处设置虚拟内存映射,如果在该地址没有映射空间,则会失败。

答案 2 :(得分:3)

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