页面 table 条目变脏的方式

the ways by which page table entry can become dirty

访问和脏 (A/D) 位告知页面是被访问还是被写入。当文件加载到内存中时,一些更改仅在内存中,但仍未与存储在磁盘上的文件同步。被修改但没有写回的页面是脏页。

我的问题是这个概念是否也适用于 ELF 文件? .code, .data 也会变脏吗?如果是那么怎么办?

My question is whether this concept also implies on ELF files?

是的。

Can .code, .data also get dirty? if yes then how?

.code通常没有写权限(只能读和执行),所以通常没有别弄脏了。

但是,您可以 mprotect 一个可写的.code 页面,并写入它(这通常用于运行时修补)。如果你这样做,相应的页面将变脏,并且 将保持 脏,因为它是用 MAP_PRIVATE 映射的(你通常不希望 运行 程序在磁盘上更改其图像)。

如果您的二进制文件有文本重定位,您也可能会弄脏 .code 页(当非 fPIC 代码链接到 ix86 上的共享库时经常发生)。

最后,.data 页面一直被修改(每次修改初始化的全局变量),然后这些页面在程序(同样,您通常不希望 运行 程序修改其磁盘映像)。

更新:

text/.code relocations with out fpic are those which are made for shared libraries at load time. then it means these relocations make .code dirty before even execution of entry instruction.

不一定。要考虑的两种情况:

  1. a.out 直接依赖于 foo.so
  2. a.out 使用 dlopen 加载 foo.so

在情况 1 中,您是正确的:foo.so 中的文本重定位将导致其 .text 页面的(部分)在执行 a.out 的第一条指令之前变脏(请注意,user-space 从 ld.so 条目开始执行,而不是从 a.out 条目开始执行。

在情况 2 中,.text 页面将作为 dlopen 的一部分变脏,它在 main 之后很久(它本身在入口指令之后很长时间)。

when .data pages are modified, in response should .code pages also become dirty for fpic or non fpic?

否:修改 .data 不会导致 .code 也变脏。为什么会这样?