访问位和脏 (A/D) 位通知页面是否被访问或写入。当文件加载到内存中时,一些更改仅在内存中,这些更改仍未与存储在磁盘上的文件同步。被修改但没有写回的页面是脏页面。
我的问题是这个概念是否也暗示 ELF 文件?.code、.data 也会变脏吗?如果是,那怎么办?
访问位和脏 (A/D) 位通知页面是否被访问或写入。当文件加载到内存中时,一些更改仅在内存中,这些更改仍未与存储在磁盘上的文件同步。被修改但没有写回的页面是脏页面。
我的问题是这个概念是否也暗示 ELF 文件?.code、.data 也会变脏吗?如果是,那怎么办?
我的问题是这个概念是否也暗示 ELF 文件?
是的。
.code、.data 也会变脏吗?如果是,那怎么办?
通常没有写权限(只有读和执行),所以它.code
通常不会变脏。
但是,您可以 mprotect
将一个.code
页面设为可写,并对其进行写入(这通常用于运行时修补)。如果你这样做了,相应的页面会变脏,并且会因为它被映射而保持MAP_PRIVATE
脏(你通常不希望正在运行的程序改变它在磁盘上的图像)。
如果您的二进制文件有文本重定位(当非代码链接到 上的共享库 .code
时经常发生这种情况),您也可能会得到脏页。fPIC
ix86
最后,.data
页面一直被修改(每次你修改一个初始化的全局变量),然后这些页面在程序的持续时间内保持脏状态(同样,你通常不希望正在运行的程序修改它的磁盘图片)。
更新:
没有 fpic 的 text/.code 重定位是在加载时为共享库进行的重定位。那么这意味着这些重定位甚至在执行入口指令之前使 .code 变脏。
不必要。需要考虑的两种情况:
a.out
这直接取决于foo.so
a.out
用于dlopen
加载foo.so
在第一种情况下,您是正确的:在执行第一条指令之前,文本重定位foo.so
将导致(某些).text
页面变脏a.out
(请注意,用户空间从ld.so
入口开始执行,而不是从a.out
入口开始执行)。
在情况 2 中,.text
页面将作为 的一部分变脏dlopen
,这在很久之后main
(它本身在 entry 指令之后很长时间)。
当 .data 页面被修改时,作为响应,.code 页面是否也应该为 fpic 或非 fpic 变脏?
否:修改.data
不会导致.code
变脏。为什么会呢?