はい、可能ですが、.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 ソース ファイル内。