【发布时间】:2016-05-08 10:07:04
【问题描述】:
我在查看man mmap 时试图了解mmap 的工作原理。
据我了解,它向页表添加了一个映射,该映射在文件和虚拟地址之间进行映射(这是给定的地址 void *addr)
那么,当两个程序映射同一个文件时会发生什么? 页表中是否有 2 个条目,每个程序一个?
【问题讨论】:
-
每个程序基本上都有单独的MMU配置。只是两个进程映射了同一个页面。
-
当一个进程尝试写入时,是写入主存(RAM)还是直接写入文件(硬盘)?
-
@Lee:在我看来,您确实了解。这正是它的意思。
-
@Lee:不一定。 在调用 msync(2) 或 munmap() 之前,该文件实际上可能不会被更新。 修改可能对映射文件或通过
read或读取文件的其他进程可见,也可能不可见FILE*流 API。如果其中一个进程调用msync(),则修改应该在所有映射中以及文件的所有尚未读取的部分中可见,请记住FILE*流式API 可能已在内部非共享缓冲区中缓冲了一些数据。跨度> -
@john 两者都不是。我建议阅读 MMU 的功能。也许现代操作系统为内存保护做了什么。最后,我建议阅读
mmap()的手册页。
标签: c linux mmap virtual-memory page-tables