Memory 理解文件映射

Memory 理解文件映射,memory,system,mmap,Memory,System,Mmap,我试图理解mmap,并获得以下链接: 我大体上理解课文,对我来说很有意义。但最后是一段,我真的不理解或者不符合我的理解 上面显示的只读页表条目并不意味着映射是只读的,它们只是一个内核技巧,在最后一刻之前共享物理内存。你可以看到“private”有点用词不当,直到你记得它只适用于更新。这种设计的结果是,映射文件的虚拟页面可以私下看到其他程序对该文件所做的更改,只要该页面只是从中读取的。一旦完成写时复制,就不会再看到其他人所做的更改。内核不能保证这种行为,但这是x86中的行为,从API的角度来看是

我试图理解mmap,并获得以下链接:

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

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

下面这几行对我不合适。我看不出有什么道理

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

这是私人的。所以它看不到其他人的改变

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

我不知道作者是什么意思。他们的旗帜是“地图只读”吗?在发生写操作之前,从程序虚拟页到页缓存中页表项的每个指针都是只读的

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

更新
在一些帮助下,它似乎成功了

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

虽然映射是私有的,但虚拟页面确实可以看到其他人所做的更改,直到它修改自己的页面为止。修改变得是私有的,并且仅对编写程序的虚拟页面可见

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

我听说页面本身也可以有权限(读/写/执行)

如果我错了,请告诉我。

此片段:

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

就是告诉你内核在优化的名义下有点作弊。即使您要求使用私有映射,内核实际上会在一开始为您提供一个共享映射。然后,如果您编写页面,它将成为私有页面

请注意,如果访问文件的所有进程都是使用
MAP\u PRIVATE
进行的,那么这种“欺骗”并不重要(没有任何区别),因为在这种情况下,不会对文件进行任何实际更改。不同进程的映射只需根据每个进程首次写入文件的时间,在不同的时间从“伪作弊映射_PRIVATE”升级到真正的“映射_PRIVATE”。这可能是一种常见的情况。只有当文件通过其他方式(与
PROT\u WRITE
共享的
MAP\u或其他常规的非
mmap
I/O操作)同时更新时,才会产生影响

我听说页面本身也可以有权限(读/写/执行)

当然可以。实际上,在最初映射文件时,您必须请求所需的权限:第三个参数是
mmap
,它将是
PROT\u READ
PROT\u WRITE
PROT\u EXEC
PROT\u NONE
的组合