web-dev-qa-db-ja.com

ファイルが変更されたことをシステムはどのように認識しますか?特にメモリマップトファイル

プロセスの外部からプロセスを見ている場合、どのファイルが変更されているかをどのように知ることができますか?

私ができることの1つは、書き込みの呼び出しを追跡することですが、プロセスはファイルをメモリにマップし、ファイルを変更してメモリに書き込むことができます。

カーネルは2つの理由で追跡する必要があります。同期が呼び出されたときに何をフラッシュするかを知る必要があり、ファイルのmtimeを更新する必要があります。

では、システムはどのようにしてそれを知るのでしょうか?

また、書き込みとmmap以外のファイルを変更する方法はありますか?

3

カーネルは、他のページと同じように変更されたページを認識します。カーネルに書き込まれると、ページテーブルのフラグが設定されて「ダーティ」とマークされます。これは、CPUまたはMMUによって、あるいは彼らの助けを借りて行われます(たとえば、ビットを直接設定したり、ソフトウェアに割り込みを発生させたりすることができます)。

しかし実際には、想定している動作は保証されていません。変更されたページは、msyncまたはmunmapが呼び出されるまで、書き戻す必要はありません(または、書き戻すためにキューに入れる必要もありません)。

ファイルを変更する方法が他にいくつあるかはわかりませんが、少なくともいくつかあります。

  1. truncate/ftruncate
  2. writevpwritevaio_writewriteのバリアント)
  3. スワップファイル、ループバックデバイスのバッキングデバイス(/ dev/loop0など)などとして使用します。
  4. ファイルの内容を変更するioctl呼び出しがある可能性があります。さらに悪いことに、これらはファイルシステム固有である可能性があります。
3
derobert