相关疑难解决方法(0)

覆盖内存映射的可执行文件时会发生什么?

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

说我有/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;
}
Run Code Online (Sandbox Code Playgroud)

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

那么发生了什么?我特别感谢任何建议,我可以做些什么来看看会发生什么(Linux或Windows).

谢谢大家.

编辑:我所指的问题引发了这个问题:没有重启的升级 - 在实践中会发生什么样的问题?

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

operating-system execution

11
推荐指数
2
解决办法
5573
查看次数

标签 统计

execution ×1

operating-system ×1