【问题标题】:the ways by which page table entry can become dirty页表条目变脏的方式
【发布时间】:2015-11-17 04:08:25
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    我的问题是这个概念是否也适用于 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

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

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

    当 .data 页面被修改时,作为响应,.code 页面是否也应该为 fpic 或非 fpic 变脏?

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

    【讨论】:

    • 感谢整合。没有 fpic 的 text/.code 重定位是在加载时为共享库进行的重定位。那么这意味着这些重定位甚至在执行入口指令之前使 .code 变脏。我对吗?当 .data 页面被修改时,作为响应,.code 页面是否也应该为 fpic 或非 fpic 变脏?
    • @shami 更新了答案。
    • 您在回答中的 fpic 提示开辟了大量阅读的新途径。我正在考虑由于重定位而导致的 .data 脏污,这应该会更改 .code 指令使用的地址。但在 pic 代码中,链接器可以根据 .code 部分的大小和指令指针偏移量计算绝对地址。所以这意味着 .data 重定位不会弄脏 .code。我说的对吗?
    猜你喜欢
    • 1970-01-01
    • 2011-11-06
    • 2019-09-17
    • 2012-11-13
    • 2019-05-13
    • 2021-09-02
    • 2021-07-02
    • 2016-02-14
    • 2014-07-31
    相关资源
    最近更新 更多