我尝试了解mmap并获得以下链接: http://duartes.org/gustavo/blog/post/page-cache-the-affair-between-memory-and-files
我理解一般的文字,这对我来说很有意义。但最后是一段,我不太懂,或者不符合我的理解。
上面显示的只读页表条目并不意味着映射是只读的,它们只是在最后一刻之前共享物理内存的核心技巧。你可以看到'私人'有点用词不当,直到你记得它只适用于更新。这种设计的结果是,只要页面只是从读取,私有地映射文件的虚拟页面就会看到其他程序对文件所做的更改。一旦完成写入复制,就不再看到其他人的更改。内核无法保证这种行为,但它是您在x86中获得的,并且从API的角度来看是有意义的。相比之下,共享映射只是映射到页面缓存,就是这样。更新对其他进程可见,最终在磁盘中。最后,如果上面的映射是只读的,则页面错误会触发分段错误而不是写入时的复制。
下面的行与我不符。我觉得没有意义。
此设计的结果是,只要页面只是从中读取,私有地映射文件的虚拟页面就会看到其他程序对文件所做的更改。
是私人的。所以它看不到别人的变化!
最后,如果上面的映射是只读的,那么页面错误会触发分段错误而不是写入时的复制。
不知道作者对此的意义。他们的旗帜是“MAP_READ_ONLY”吗?在发生写入之前,从程序虚拟页面到页面缓存中的页面表条目的每个指针都是只读。
你能帮我理解这两行吗? 感谢
更新
它似乎得到了它,并提供了一些帮助。
这种设计的结果是,只要页面只是被读取,私有地映射文件的虚拟页面就会看到其他程序对文件所做的更改。
虽然映射是私有的,但虚拟页面确实可以看到其他人的更改,直到它修改了自己的页面。修改变为是私有的,并且只对编写程序的虚拟页面可见。
最后,如果上面的映射是只读的,那么页面错误会触发分段错误而不是写入时的复制。
我被告知页面本身也可以拥有权限(读/写/执行)。
告诉我,如果我错了。
答案 0 :(得分:1)
这个片段:
此设计的结果是,只要页面只是从中读取,私有地映射文件的虚拟页面就会看到其他程序对文件所做的更改。
告诉你内核在优化名称中略有欺骗。即使你已经要求私有映射,内核实际上会先给你一个共享映射。然后,如果您编写页面,它将变为私有。
如果正在访问该文件的所有进程都使用MAP_PRIVATE
进行操作,请注意这个“作弊”并不重要(没有任何区别),因为文件中不会发生实际的更改那种情况。根据每个进程首次写入文件的时间,不同进程的映射将在不同时间从“假作弊MAP_PRIVATE”升级到真正的“MAP_PRIVATE”。这可能是一种常见的情况。只有当文件通过其他方式(MAP_SHARED
与PROT_WRITE
或其他常规,非mmap
I / O操作)同时更新时,才会产生影响。
我被告知页面本身也可以拥有权限(读/写/执行)。
当然,他们可以。实际上,您必须在初始映射文件时询问所需的权限:mmap
的第三个参数,它将是PROT_READ
,PROT_WRITE
,{{1 }和PROT_EXEC
。