Met*_*est 9 c linux gcc mmap x86-64
该MMAP文件说,下面讲的标志MAP_NORESERVE.
不要为此映射保留交换空间.保留交换空间时,可以保证可以修改映射.如果没有保留交换空间,如果没有可用的物理内存,则可能在写入时获得SIGSEGV.
实际上我想要的只是保留虚拟内存地址而不是分配实际的物理内存.可以使用带有MAP_NORESERVE的mmap完成吗?如果我想使用任何物理内存,我会使用MAP_FORED再次在地址范围内使用MAP_NORESERVE通过mmap分配的地址范围内.
总而言之,我希望内核不为使用带有MAP_NORSERVE标志的mmap分配的内存保留任何物理页面.它是否真的像这样工作,或者如果内核有足够的物理内存,内核是否会分配物理页面?
使用普通的就可以了mmap()。任何实现 mmap 的足够现代的操作系统(即过去,什么,1995 年?)也实现了需求分页,并且只有在实际写入时才会保留页面。
Mmap()是管理{地址,物理内存,磁盘块}之间关联的方法之一.此关联的所有三个成员都是资源.关联保存在页表条目(PTE)中
mmap()实际上做的是:
上述步骤中的许多(3个中的3个)是可选的,并且取决于mmap()调用中提供的实际参数和标志.(fd可能为-1:创建匿名映射,start-adress可能为NULL:mmap应分配(先前)未使用的内存范围)
在调用mmap()之后,内核中的pagefault-handler应该能够找到要做的事情.(将物理ram附加到页面;刷新和分离;分配和COW,......)
不保留交换空间意味着调用者信任将来任何时候都有足够的交换空间.交换空间由所有进程共享,因此永远不能保证有足够的空间.预分配它(或多或少)可以保证调用进程总是足够的.(当不是:mmap()应该失败)