Что происходит, когда вы перезаписываете исполняемый файл с отображением в память?

После комментариев к одному из моих вопросов меня заинтриговало, что происходит, когда кто-то перезаписывает исполняемый файл. Мне нужно проверить мое понимание по этому поводу.

Допустим, у меня есть / 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 
#include 

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

    return 0;
}

И, конечно же, я мог а) заменить это исполняемый файл во время его работы и б) его вывод не изменился.

Итак, что происходит? Я' Я особенно благодарен за любые предложения, которые я могу сделать, чтобы увидеть, что произойдет (Linux или Windows).

Всем спасибо.

Изменить: вопрос, на который я имел в виду, который вызвал этот вопрос: Обновления без перезагрузки - что Какие проблемы случаются на практике?

Кроме того, я знаю, что это не относится конкретно к программированию, а относится к результату обновления исполняемого файла. Однако мне все еще интересно, и я не могу придумать лучшего места, чтобы спросить об этом.

11
задан Community 23 May 2017 в 12:17
поделиться