以前のinitrd
システムでは、Linuxを使用して画像を公開していましたinitrd
。これはコンソールで追跡されます。
Freeing initrd memory: xxxxk freed.
ここで言うのは、実際に圧縮された元の画像が占有していたメモリを解放するということです。マウントされたアクティブファイルシステムは、pivot_root
マウント解除(ルート交換)によって解放されます。
initramfs
ファイルシステムは、などの特定のユーティリティを使用して再帰的に削除することによって解放され、マウントswitch_root
解除されません。わかりましたが、.cpio
オリジナル画像(圧縮アーカイブ)はどこに公開されますか?
私は探して、init/initramfs.c (populate_rootfs)
実際にまたは両方からデータを解凍することが可能であることを発見しましたinitramfs
!この領域はによって解放されますが、ここには最初から同様のメモリ解放を実行するロジックはありません。__initramfs_start
initrd_start
initrd
free_initrd()
__initramfs_start
誰かがこのメモリを解放する方法を明らかにできますか?それともまだリリースされていないことを確認していますか?使用されていない他のメモリと一緒に廃棄されたセクションにありますか?
__initramfs_start
解放された未使用メモリの範囲外であることを示すいくつかの診断を追加しました。これはARM組み込みシステムにあります。
[ 1.241857] Freeing unused kernel memory: 3240K [c0c01000, c0f2b000)
[ 1.241874] Initramfs image starts at: e7fddef0
しかし、リンカースクリプトを見るとINITRAMFS
はい__init_start
と記号の間に配置されるので、__init_end
この違いはいくつかのランタイム再配置によるものかもしれませんか?サイズはほぼ正確です。元の圧縮画像は、2958550バイトで報告された3240Kの大部分を合理的に説明しています。
答え1
さて、次の実験でメモリが解放されることを確認しました。に数メガバイトのランダムゴミを追加し、initramfs
カーネルをビルドしてから起動しました。報告されたFreeing unused kernel memory
サイズはおよそごみのサイズだけ増加します。さらに、これらの拡張はfree
ブートによって表示される利用可能なメモリには影響しません/proc/meminfo
。