1

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

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

4

1 回答 1

2

我的问题是这个概念是否也暗示 ELF 文件?

是的。

.code、.data 也会变脏吗?如果是,那怎么办?

通常没有写权限(只有读和执行),所以它.code 通常不会变脏

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

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

最后,.data页面一直被修改(每次你修改一个初始化的全局变量),然后这些页面在程序的持续时间内保持脏状态(同样,你通常不希望正在运行的程序修改它的磁盘图片)。

更新:

没有 fpic 的 text/.code 重定位是在加载时为共享库进行的重定位。那么这意味着这些重定位甚至在执行入口指令之前使 .code 变脏。

不必要。需要考虑的两种情况:

  1. a.out这直接取决于foo.so
  2. 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变脏。为什么会呢?

于 2015-08-24T00:00:17.423 回答