gpt4 book ai didi

operating-system - 当您覆盖内存映射可执行文件时会发生什么?

转载 作者:行者123 更新时间:2023-12-04 01:40:32 24 4
gpt4 key购买 nike

根据对我的一个问题的评论,我很想知道当覆盖可执行文件时会发生什么。我需要检查我对此事的理解。

说我有 /usr/bin/myprog .我运行它,所以操作系统加载 /usr/bin/myprog ,可能通过 http://en.wikipedia.org/wiki/Memory-mapped_file#Common_uses .

无论出于何种原因,该进程仍保留在内存中,我决定实际上我已经修复了一个错误并覆盖了 /usr/bin/myprog .

所以,据我了解:

  • 如果 myprog 的实例已经加载,我替换了其中的文件 myprog已经加载,myprog的实例未修改。
  • 如果我运行 myprog 的新实例它将使用新代码。

  • 我说得对吗?

    但是,根据关于内存映射文件的文章,这种技术允许开发人员将文件的某些部分视为物理内存。

    所以我看到我理解事物的方式是矛盾的。如果页面确实只是按需加载,则假设 myprog不是 100% 分页,这篇维基百科文章暗示将从磁盘上的文件加载新页面,自加载原始图像以来,该文件已更改。

    但是,我很确定我的两个编译图像不会相同,并且每个文件的相关地址偏移量也不相同。因此,假设发生这种情况,指令指针将非常丢失......我很确定操作系统不会将两个不同图像的一部分作为同一进程的一部分加载到内存中。

    那么内存映射/需求分页的组合如何为程序的执行工作呢?覆盖该文件是否会在每个可执行文件的页面上触发页面错误以确保为当前运行的进程加载它?

    我做了一个快速的实验:
    #include <stdio.h>
    #include <unistd.h>

    int main(int argc, char** argv)
    {
    printf("Program resident...");
    while(1)
    {
    printf("??? Just notifying you I'm still here...\n");
    usleep(1000000);
    }

    return 0;
    }

    果然我可以 a) 在它运行时替换这个可执行文件,b) 它的输出没有改变。

    那么发生了什么?我特别感谢对我可以做的事情的任何建议,看看会发生什么(Linux 或 Windows)。

    谢谢大家。

    编辑:我所指的问题引发了这个问题: Upgrades without reboot - what kinds of problems happen in practice?

    另外,我知道这与编程无关,而是与更新可执行文件的结果有关。然而,我仍然很感兴趣,我想不出更好的地方来问它。

    最佳答案

    在 Linux 下,如果在运行时替换可执行文件,结果是不可预测的,并且可能会崩溃。已修改的页面(例如“bss”初始化数据)不会受到影响,但未修改的页面(例如大多数代码)会受到影响。

    我的猜测是,在您的情况下,字符串位于修改(复制)页面的一部分中,因此不受影响。

    但是,只有当您实际覆盖同一个文件时才会发生所有这些。

    大多数情况下,当您替换可执行文件时,您将使用不同的文件替换目录条目。这通常是通过在现有文件上重命名一个临时文件(在同一目录中)来完成的。这就是(例如)包管理器所做的。

    在替换目录条目的情况下,先前的可执行文件作为一个完全独立的(仍在执行)文件继续存在,并且先前的可执行文件可以毫无问题地丢弃和重新加载其页面 - 它仍然可以看到旧文件。

    我不知道链接器如何处理它的输出。但是/usr/bin/install 会创建一个新文件。我希望这种行为是故意的。

    关于operating-system - 当您覆盖内存映射可执行文件时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4453781/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com