GNU/Linux >> Linux の 問題 >  >> Linux

再構築せずに vmlinux.bin (組み込みの initramfs) からファイル システム イメージを再パックしますか?

はい、可能ですが、.init.ramfs セクションのサイズとアドレスを変更するだけでは十分ではありません。これは、カーネルの ELF 実行可能ファイルが start と end の仮想アドレスに静的にリンクされているためです。 initramfs のセクションの。

Linux ソースでは、関連するコードは iniramfs.c ソース ファイルにあります。

void __init populate_rootfs(void)
{
  char *err = unpack_to_rootfs(__initramfs_start, __initramfs_end - __initramfs_start, 0); 
...
}

そのため、.init.text セクションにある unpack_to_rootfs() 関数の呼び出しのマシン コードで、これら 2 つのオフセットも変更する必要があります。 (再配置テーブル内の関連するエントリに注意してください! ...存在する場合)

また、Icarus の回答を参照すると、initramfs のセクションのサイズ、ファイル オフセット、開始仮想アドレス、および前述の 2 つのオフセット (unpack_to_rootfs() 関数の引数) を操作すると、独自のカスタム <強い>大きい ELF ファイルの最大仮想アドレスより上にロードされる initramfs セクション。古い仮想アドレス空間の末尾に追加されたより大きな initramfs セクションを反映するために、プログラム ヘッダー (PHeader) の「メモリ サイズ」フィールドも変更する必要があります。

P.S.元の init.ramfs セクションを新しい高い開始仮想アドレスに移動した後に残っているカーネルの仮想アドレス空間の「穴」は、定義された free_initmem(void) 関数によって関連付けられたメモリが後で解放されるため、何の害もありません。 init.c ソース ファイル内。


Linux
  1. Linux – Vmlinuxヘッダーにはカーネルイメージの長さが含まれていますか?

  2. コマンドラインから.pdf画像をフラット化する方法は?

  3. ELF セクションの生のコンテンツのみを抽出する方法は?

  1. ファイル全体を読み取らずに、大きなファイルの末尾から X バイトを削除する方法は?

  2. initrd と initramfs の違いは?

  3. プロジェクトにアセンブリ ファイルが含まれている場合、mmap からの予期しない exec 権限

  1. 端末で sips を使用して、アップスケーリングせずに画像のサイズを変更するにはどうすればよいですか?

  2. フルパスから拡張子なしでファイル名を抽出する方法は?

  3. データを失うことなくファイルシステム形式を xfs から ext4 に変更する