0

我尝试理解 mmap 并阅读以下链接:http:
//duartes.org/gustavo/blog/post/page-cache-the-affair-between-memory-and-files

我总体上理解文本,这对我来说很有意义。但最后是一段,我不是很理解或者不符合我的理解。

上面显示的只读页表条目并不意味着映射是只读的,它们只是共享物理内存直到最后一刻的内核技巧。您可以看到“私人”是多么用词不当,直到您记住它仅适用于更新。这种设计的结果是,映射文件的虚拟页面私下看到其他程序对该文件所做的更改,只要该页面仅被读取过. 一旦写时复制完成,其他人的更改将不再可见。内核不保证这种行为,但这是您在 x86 中得到的,并且从 API 的角度来看是有意义的。相比之下,共享映射只是映射到页面缓存,仅此而已。更新对其他进程可见并最终保存在磁盘中。最后,如果上面的映射是只读的,页面错误将触发分段错误而不是写时复制。

对线的跟随与我不匹配。我看没有道理。

这种设计的一个结果是,一个映射文件的虚拟页面私下看到其他程序对该文件所做的更改,只要该页面仅被读取过

它是私人的。所以它看不到别人的变化!

最后,如果上面的映射是只读的,页面错误将触发分段错误而不是写时复制。

不知道作者这句话是什么意思。他们的标志是“MAP_READ_ONLY”吗?在发生写入之前,从程序虚拟页面到页面缓存中的页面表条目的每个指针都是只读的

你能帮我理解这两行吗?谢谢

更新
它似乎得到了它,有一些帮助。

这种设计的结果是,映射文件的虚拟页面私下看到其他程序对该文件所做的更改,只要该页面仅被读取过。

尽管映射是私有的,但虚拟页面确实可以看到其他人的更改,直到它修改自己的页面。修改变为私有,只对编写程序的虚拟页面可见。

最后,如果上面的映射是只读的,页面错误将触发分段错误而不是写时复制。

我被告知页面本身也可以具有权限(读/写/执行)。

如果我错了,请告诉我。

4

1 回答 1

1

这个片段:

这种设计的一个结果是,一个映射文件的虚拟页面私下看到其他程序对该文件所做的更改,只要该页面只是从.

是在告诉你内核以优化的名义作弊。即使您已经要求私有映射,内核实际上也会首先给您一个共享映射。然后,如果您编写该页面,它就会变成私有的。

请注意,如果正在访问文件的所有进程都在使用 执行此操作,则此“作弊”无关紧要(没有任何区别)MAP_PRIVATE,因为在这种情况下不会发生对文件的实际更改。根据每个进程首次写入文件的时间,不同进程的映射将在不同时间简单地从“假作弊 MAP_PRIVATE”升级为真正的“MAP_PRIVATE”。这可能是一种常见的情况。只有通过其他方式(MAP_SHARED使用PROT_WRITE或其他常规的非mmapI/O 操作)同时更新文件时,它才会有所作为。

我被告知页面本身也可以具有权限(读/写/执行)。

当然,他们可以。您必须在最初映射文件时询问您想要的权限,事实上:第三个参数是mmap,它将是PROT_READPROT_WRITEPROT_EXEC和的组合PROT_NONE

于 2012-04-20T18:10:16.523 回答