【发布时间】:2011-05-26 02:58:11
【问题描述】:
根据我的一个问题,我很想知道当一个人覆盖可执行文件时会发生什么。我需要检查我对此事的理解。
假设我有/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?
另外,我知道这与编程无关,而是更新可执行文件的结果。不过,我仍然很感兴趣,我想不出比这更好的地方了。
【问题讨论】:
标签: operating-system execution