2011-11-11 9 views
7

プロセスBがプロセスAのイメージに何らかのデータを(通常のwrite()システムコールで)書き込むとどうなりますか?プロセスAが実行しているものが破損することはありませんか?Linux上で実行中のプロセスのイメージに書き込む

私はLinuxが初めてです。私が理解する限り、Unixは歴史的に(Windowsのような)必須のファイルロックを課していません。だから執筆はかなり可能です。

私はWebを検索していません。 Linuxの経験豊かな同僚にこの質問をすると、プロセスAはそのイメージが完全にメモリ内にあると答えています。

しかし、私が読んだことから、カーネルは、メモリの少ない状態が強調されたときに、いくつかのページをメモリからイメージファイルに簡単に戻すことができます。したがって、ディスク上にある間に、一部のページが別のライタープロセスによって破損する可能性があります。その後、RAMにスワップバックして実行することができます。

+0

チェックするために私の答えを参照してください。http://stackoverflow.com/questions/4453781/what-happens-when-you-overwrite-a-memory-mapped-executable – Antoine

答えて

2

別のプロセス/proc/1234/memに書き込みを行うプロセスを考えていますか?pid_t 1234?

また、別のプロセスのELF実行可能ファイルにプロセスを書き込むことを考えていますか?

どちらのシナリオも非常に珍しく、Linux固有のものです(他のPosixにはこれらがありません)。その場合、何が起こるか分かりません。しかし、少なくとも許可機構は、あるものを保護すべきである。

ETXTBSYも参照してください。

strace -f /usr/bin/gcc hello.c -o helloによって示されるように)実際、ほとんどのコンパイルは、古い実行可能ファイルに書き込むことはありませんので、コンパイラとリンカは、実行可能ファイルを書き込むためにそれを-ing 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 

実行可能ファイルに書き込むには、あなたは一生懸命やらなければなりません。もちろん、そうすると、いたずらにクラッシュすることがあります。

+0

I第2のシナリオを意味する。 –

+0

ETXTBSYはここでの最大のヒントでしょう。私の経験上、実行中の実行可能ファイルの一部を上書きしようとすると、ETXTBSYのエラーが発生します。また、ファイルの内容を上書きすることは、ファイルを削除してposixシステム上で同じファイル名で新しいファイルを作成することとは非常に異なることに注意してください。 – nos

+0

Antoineによってリンクされた質問には詳細な議論があります。私は、ETXTBSYはもはや何も起こっていないと思います(静的にリンクされた実行ファイルを除いて)。 –

1

あなたが読んだことは、ページが「イメージファイル」に戻ってスワップされる可能性があることを示唆していますか?

システムのメモリが不足している場合、ページはディスク上のスワップパーティションにスワップされます。これは実行可能ファイルとは異なります。実行ファイルへの書き込みは、次にファイルを実行するまで有効になりません。

スワップファイルの正確なページに何らかの形で書き込むことができれば(データがディスクに書き込まれた場所とタイミングを正確に把握する必要があるため)そうした場合は、オブジェクトコードを変更できる可能性があります。あなたは実行可能ファイルを破損させることを提案していますか?実行中にプログラムを変更するための巧妙な方法はありますか?

+0

私はオブジェクトコードの破損の望ましくない可能性に懸念しています。私は、カーネルが実行可能イメージ用にスワップパーティションを使用することに疑問を持っています。それについて考えることができる限り、それはあまりにも無駄でしょう。カーネルはむしろ、通常のmmapと同様の方法でイメージをマップします。 –

+0

クリーンページはまったくスワップアウトされません。単に削除され、再度必要になった場合にマップされたファイルから再ロードされます。 – caf

1

実際には、ページをスワップアウトするために「低メモリ状態」を持つ必要はありません。 Linuxは実行可能ファイルを「オンデマンドで」ロードするので、必要なときにページがロードされるだけです。

しかし、そこに以前のものWhat happens when you overwrite a memory-mapped executable?