Запись образа исполняемого процесса в Linux - PullRequest
8 голосов
/ 11 ноября 2011

Что если процесс B записывает (с помощью обычного системного вызова write ()) некоторые данные в образ процесса A, пока выполняется последний?Не приведет ли это к повреждению того, что процесс А выполняет?

Я новичок в Linux.Насколько я понимаю, Unix исторически не налагает обязательной блокировки файлов (как Windows).Так что написание вполне возможно.

Я искал в Интернете безрезультатно.Когда я задаю этот вопрос моим опытным коллегам из Linux, они все отвечают, что у процесса А образ полностью находится в памяти.

Тем не менее, из того, что я прочитал, ядро ​​может легко поменять некоторые страницы назад.к файлу изображения из памяти, скажем, когда напряженные условия памяти.Поэтому, находясь на диске, некоторые страницы могут быть повреждены другим процессом записи;после этого их можно вернуть в оперативную память и выполнить.

Ответы [ 3 ]

3 голосов
/ 11 ноября 2011

Вы думаете о процессе, записывающем в какой-то /proc/1234/mem другой процесс pid_t 1234?

Или вы думаете о процессе, записывающем в исполняемый файл ELF другой процесс?

Оба сценария очень необычны и специфичны для Linux (у других Posix их нет), поэтому я не знаю, что может произойти в этом случае. Но, по крайней мере, механизм разрешения должен защищать некоторых.

См. Также ошибку ETXTBSY.

На практике (как показано strace -f /usr/bin/gcc hello.c -o hello) компилятор и компоновщик удаляют исполняемый файл до open, что делает его для записи исполняемого файла, поэтому большая часть компиляции никогда не записывает в старый исполняемый файл:

870   stat("hello", {st_mode=S_IFREG|0755, st_size=6096, ...}) = 0
870   unlink("hello")                   = 0
870   open("hello", O_RDWR|O_CREAT|O_TRUNC|O_CLOEXEC, 0777) = 17
870   fstat(17, {st_mode=S_IFREG|0755, st_size=0, ...}) = 0

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

2 голосов
/ 11 ноября 2011

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

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

Если каким-то образом вы смогли записать точную страницу файла подкачки (что было бы трудно, потому что вам пришлось быточно знать, где и когда данные были записаны на диск).Если вы это сделаете, вы сможете изменить объектный код.Вы предлагаете испортить исполняемый файл или какой-нибудь умный способ изменить программу во время ее работы?

1 голос
/ 11 ноября 2011

На самом деле нет необходимости иметь «низкое количество памяти» для страниц, подлежащих замене.В любом случае Linux загружает исполняемые файлы «по требованию», поэтому страница загружается только тогда, когда это необходимо.

Но посмотрите мой ответ на предыдущий Что произойдет, если вы перезаписываете исполняемый файл с отображением в памяти?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...