ファイルが変更されたら、システムはどのようにわかりますか?特にメモリマッピングファイル

ファイルが変更されたら、システムはどのようにわかりますか?特にメモリマッピングファイル

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

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

カーネルには2つの理由でトレースが必要です。 syncが呼び出されたときに何をフラッシュするかを知っておく必要があり、ファイルのmtimeを更新する必要があります。

では、システムはどのようにわかりますか?

書き込みとmmapに加えてファイルを変更する他の方法はありますか?

答え1

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

ただし、実際には想定した動作は保証されません。変更されたページは、msyncまたは呼び出されるまで書き換える必要はありません(または書き込みを保存するためにキューに入れることもできます)。munmap

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

  1. truncate/ftruncate
  2. writev、、(の変形pwritevaio_writewrite
  3. スワップファイル、ループバックデバイス用のバックアップデバイス(/dev/loop0)などとして使用します。
  4. ioctlファイルの内容を変更する呼び出しがある可能性があります。さらに悪いことは、ファイルシステムによって異なる可能性があるということです。

関連情報