mmap文档说明了MAP_NORESERVE标志。
不要为此映射保留交换空间。当交换空间是 保留,一个保证可以修改 映射。当交换空间没有被保留时,可能会得到一个SIGSEGV 如果没有可用的物理内存则写入。
我真正想要的只是保留虚拟内存地址而不是分配实际的物理内存。可以使用带有MAP_NORESERVE的mmap完成吗?如果我想使用任何物理内存,我会使用MAP_FORED再次在地址范围内使用MAP_NORESERVE通过mmap分配的地址范围内。
总而言之,我希望内核不为使用带有MAP_NORSERVE标志的mmap分配的内存保留任何物理页面。它是否真的像这样工作,或者如果有足够的物理内存,内核是否会分配物理页面?
答案 0 :(得分:6)
Mmap()是管理{地址,物理内存,磁盘块}之间关联的方法之一。此关联的所有三个成员都是资源。关联保存在页表条目(PTE)中
mmap()实际上是:
上述步骤中的许多(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?)也实现了请求分页,只有在实际写入页面时才会保留页面。