页表条目可能变脏的方式

时间:2015-08-23 19:02:09

标签: memory-management linux-kernel elf page-tables

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

我的问题是这个概念是否也暗示了ELF文件? 可以.code,.data也变脏了吗?如果是的话怎么样?

1 个答案:

答案 0 :(得分:2)

  

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

  

.code,.data也会弄脏吗?如果是,那怎么样?

.code 通常没有写入权限(只有读取和执行),因此 通常不会变脏

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

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

最后,.data页面始终被修改 (每次修改初始化的全局变量),然后这些页面在程序的持续时间内保持脏(再次,您通常不希望正在运行的程序修改其磁盘映像。

<强>更新

  带有fpic的

text / .code重定位是在加载时为共享库创建的。那么这意味着这些重定位会在执行输入指令之前使.code变脏。

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

  1. a.out直接取决于foo.so
  2. a.out使用dlopen加载foo.so
  3. 在案例1中,您是对的:foo.so中的文本重定位将导致(某些)其.text页面在执行a.out的第一条指令之前变脏(请注意用户空间从ld.so条目开始执行,而不是从a.out条目开始执行。

    在案例2中,.text页面将变为脏dlopen的一部分,main.data之后很长时间(在入口指令之后很久)。

      

    当.data页面被修改时,作为回应,.code页面对于fpic或非fpic也会变脏吗?

    否:修改.code不会导致import yaml with open('data.txt') as file: data = yaml.safe_load(file) 变脏。为什么会这样?