Answers:
脏页不一定需要回写。脏页是自内核最后一次将其标记为干净以来写入的页。并非总是需要将数据保存回原始文件中。
这些页面是私有的,不是共享的,因此不会将它们保存回原始文件中。脏文件由只读文件支持是不可能的。如果需要从RAM中删除页面,则将页面保存在交换中。
只读,私有和脏页但在内存映射文件范围内的页通常是数据页,其中包含需要在运行时初始化的常量,但在初始化后不会更改。例如,它们可能包含嵌入指针的静态数据。指针值取决于程序或库所映射的地址,因此必须在程序启动后进行计算,并且页面在此阶段是可读写的。在计算完指针之后,页面的内容在此程序实例中将永远不会更改,因此可以将页面更改为只读。有关代码片段的示例,请参见stosb的“查找脏内存页面”。
您可能很少看到只读的,可执行的,私有的,脏页;某些链接器可以更自由地混合代码和数据,也可以通过即时编译来实现。
除了案例,吉尔斯还列出了:
当进程派生时,内核可能会将其所有脏页都标记为只读,并且它们将在父级和子级之间共享。当其中一个进程写入页面时,将发生异常,内核将复制该页面并将其标记为可写。这样可以节省复制页面的工作,而最终两个页面都不会再次对其进行修改。(请注意,在这种情况下,页面在硬件中被标记为只读,但内核知道这些页面可写。)