我尝试理解 mmap 并阅读以下链接:http:
//duartes.org/gustavo/blog/post/page-cache-the-affair-between-memory-and-files
我总体上理解文本,这对我来说很有意义。但最后是一段,我不是很理解或者不符合我的理解。
上面显示的只读页表条目并不意味着映射是只读的,它们只是共享物理内存直到最后一刻的内核技巧。您可以看到“私人”是多么用词不当,直到您记住它仅适用于更新。这种设计的结果是,映射文件的虚拟页面私下看到其他程序对该文件所做的更改,只要该页面仅被读取过. 一旦写时复制完成,其他人的更改将不再可见。内核不保证这种行为,但这是您在 x86 中得到的,并且从 API 的角度来看是有意义的。相比之下,共享映射只是映射到页面缓存,仅此而已。更新对其他进程可见并最终保存在磁盘中。最后,如果上面的映射是只读的,页面错误将触发分段错误而不是写时复制。
对线的跟随与我不匹配。我看没有道理。
这种设计的一个结果是,一个映射文件的虚拟页面私下看到其他程序对该文件所做的更改,只要该页面仅被读取过。
它是私人的。所以它看不到别人的变化!
最后,如果上面的映射是只读的,页面错误将触发分段错误而不是写时复制。
不知道作者这句话是什么意思。他们的标志是“MAP_READ_ONLY”吗?在发生写入之前,从程序虚拟页面到页面缓存中的页面表条目的每个指针都是只读的。
你能帮我理解这两行吗?谢谢
更新
它似乎得到了它,有一些帮助。
这种设计的结果是,映射文件的虚拟页面私下看到其他程序对该文件所做的更改,只要该页面仅被读取过。
尽管映射是私有的,但虚拟页面确实可以看到其他人的更改,直到它修改自己的页面。修改变为私有,只对编写程序的虚拟页面可见。
最后,如果上面的映射是只读的,页面错误将触发分段错误而不是写时复制。
我被告知页面本身也可以具有权限(读/写/执行)。
如果我错了,请告诉我。