外部からプロセスを見ると、どのファイルが変更されたかをどうやって知ることができますか?
私ができることの1つは書き込み呼び出しを追跡することですが、プロセスはファイルをメモリにマップし、メモリ変更ファイルを書き込むことができます。
カーネルには2つの理由でトレースが必要です。 syncが呼び出されたときに何をフラッシュするかを知っておく必要があり、ファイルのmtimeを更新する必要があります。
では、システムはどのようにわかりますか?
書き込みとmmapに加えてファイルを変更する他の方法はありますか?
答え1
カーネルは、他のページと同様に、どのページが変更されたかを知っています。書き込みが行われると、ページテーブルのフラグが「ダーティ」として表示されるように設定されます。これは、CPU、MMU、またはCPUまたはMMUの助けを借りて行うことができます(たとえば、ビットを直接設定したり、割り込みを発生させたり、ソフトウェアに実行させることができます)。
ただし、実際には想定した動作は保証されません。変更されたページは、msync
または呼び出されるまで書き換える必要はありません(または書き込みを保存するためにキューに入れることもできます)。munmap
ファイルを変更する他の方法がどれほど多いかはわかりませんが、少なくともいくつかあります。
truncate
/ftruncate
writev
、、(の変形pwritev
)aio_write
write
- スワップファイル、ループバックデバイス用のバックアップデバイス(/dev/loop0)などとして使用します。
ioctl
ファイルの内容を変更する呼び出しがある可能性があります。さらに悪いことは、ファイルシステムによって異なる可能性があるということです。