私はeMMCをサポートするLinux 3.10開発デバイス(Android)を持っており、Linuxが実際にページキャッシュの代わりにeMMCから読み取る場合をよりよく理解しようとしています。特にELFロードプロセスに興味があり、次の結果を説明できません。
initが実行されているファイルシステムにELFファイルを配置しましたが、終了しません。 ELFファイルデータはブロック0x22d930-0x22da78にあり、このブロックへのすべてのeMMC読み取りアクセスを記録するようにカーネルを変更しました。起動プロセス中、ログには、eMMCからELFファイル全体を読み取ったことが表示されます。
mmc read block: 0x22d930, num_blocks: 0x20
mmc read block: 0x22d9f0, num_blocks: 0x88
mmc read block: 0x22d950, num_blocks: 0xa0
これは、initの最初の分岐/実行が私のELF(0x20 + 0x88 + 0xa0 = 0x22da78 - 0x22d930)のときにeMMCでELF全体を読みたいと思うので理解されています。
ページキャッシュを削除してプロセスを終了すると混乱します。プロセスを終了すると、他のブランチ/execveを介してプロセスを自動的に再起動するようにinitが設定されます。ページキャッシュを削除すると、eMMCからELF全体を再読み込みできるようになります。ただし、次のコマンドを実行すると、部分的なeMMC読み取りアクセスのみが表示されます。
echo 3 > /proc/sys/vm/drop_caches && kill -9 <pid>
mmc read block: 0x22d960, num_blocks: 0x10
mmc read block: 0x22d988, num_blocks: 0x8
mmc read block: 0x22d9a0, num_blocks: 0x8
mmc read block: 0x22d9c0, num_blocks: 0x40
mmc read block: 0x22da40, num_blocks: x018
mmc read block: 0x22da60, num_blocks: 0x18
私のプロセスは新しいPIDで正常に再起動しましたが、LinuxがディスクからELF全体を再読み込みできない理由を理解できません。 Linuxでは、execveが読み取る最初のファイルであるELFヘッダーも再読み込みしません。
ソースプロセスのソースファイルマップの一部はまだ一部のキャッシュ/RAMにありますか?次のコマンドは私のプロセスのみを示しています。
lsof | grep <ELF name>
この動作を説明し、ロジックに問題があると思うのを手伝ってくれてありがとう。
答え1
問題は、init再起動プロセスとページキャッシュ削除の間のタイミングのようです。kill -9 <pid> && echo 3 > /proc/sys/vm/drop_caches
正しい順序は解放されるのではなく、次のようになります。
stop <service>
echo 3 > /proc/sys/vm/drop_caches
start <service>
サービスが停止すると、ファイルマッピングはページキャッシュにロックされなくなり、削除できます。これにより、Linux はサービスの再起動時にディスクから ELF を再読み込みします。