访问和脏(A / D)位通知页面是访问还是写入。当文件加载到内存中时,某些更改仅在内存中仍然与磁盘上存储的文件同步。修改但未写回的页面是脏页。
我的问题是这个概念是否也暗示了ELF文件? 可以.code,.data也变脏了吗?如果是的话怎么样?
答案 0 :(得分:2)
我的问题是这个概念是否也暗示了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
在案例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)
变脏。为什么会这样?