为什么只读内存映射的区域有脏页?


8

执行(例如)以下命令以获取内存映射页面的列表:

pmap -x `pidof bash`

我得到以下输出: 在此处输入图片说明 为什么有些只读页面被标记为“脏”,即需要写回的已写页面?如果它们是只读的,则该过程将无法对其进行写...(在所提供的示例中,脏页始终为4 kB,但我发现其他情况下它们的值不同)

我还检查了/ proc / pid / smaps,这些页面被描述为“私人脏污”。

Answers:


7

脏页不一定需要回写。脏页是自内核最后一次将其标记为干净以来写入的页。并非总是需要将数据保存回原始文件中。

这些页面是私有的,不是共享的,因此不会将它们保存回原始文件中。脏文件由只读文件支持是不可能的。如果需要从RAM中删除页面,则将页面保存在交换中。

只读,私有和脏页但在内存映射文件范围内的页通常是数据页,其中包含需要在运行时初始化的常量,但在初始化后不会更改。例如,它们可能包含嵌入指针的静态数据。指针值取决于程序或库所映射的地址,因此必须在程序启动后进行计算,并且页面在此阶段是可读写的。在计算完指针之后,页面的内容在此程序实例中将永远不会更改,因此可以将页面更改为只读。有关代码片段的示例,请参见stosb的“查找脏内存页面”

您可能很少看到只读的,可执行的,私有的,脏页;某些链接器可以更自由地混合代码和数据,也可以通过即时编译来实现。


我尚未对其进行验证,但是我怀疑您还会获得带有非PIC共享对象的只读,可执行,私有脏页。我似乎记得这就是事实上实际上需要PIC共享对象的原因。
安德鲁·亨利

2

除了案例,吉尔斯还列出了:

当进程派生时,内核可能会将其所有脏页都标记为只读,并且它们将在父级和子级之间共享。当其中一个进程写入页面时,将发生异常,内核将复制该页面并将其标记为可写。这样可以节省复制页面的工作,而最终两个页面都不会再次对其进行修改。(请注意,在这种情况下,页面在硬件中被标记为只读,但内核知道这些页面可写。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.