web-dev-qa-db-ja.com

UEFI / EFIブートでカーネル引数としてadd_efi_memmapを指定する必要があるのはいつですか?

LinuxカーネルをEFIスタブ(efistub)でロードする方法のチュートリアルを読んでいます。これらの命令は、カーネルブートパラメーターadd_efi_memmapをよく使用します。対象となるハードウェアは、8GBのRAMを搭載したIntel x64です。現在のセットアップでは、grub-efiブートローダーとカーネルv3.13を実行しています。

[〜#〜] grub [〜#〜]ブートなしadd_efi_memmapブート引数:

  • 23 BIOS-e820ライン dmesg | grep BIOS-e820: | wc -lでカウント
  • 243 EFIメモリライン dmesg | grep efi:\ mem | wc -lでカウント
  • DMAゾーン:24ページ予約済み
  • メモリ:7840568K/8283384K利用可能
  • 442816K予約済み

[〜#〜] grub [〜#〜]ブートwithadd_efi_memmapとEFIメモリマップサイズが異なるようです:

  • 23 BIOS-e820ライン
  • 57 EFIメモリライン
  • DMAゾーン:22ページ予約済み
  • メモリ:7885076K/8283384K利用可能
  • 398308K予約済み

EFIスタブブートなしadd_efi_memmap

  • 22 BIOS-e820ライン
  • 60 EFIメモリライン
  • DMAゾーン:21ページ予約済み
  • メモリ:7885012K/8283384K利用可能

EFIスタブブートwithadd_efi_memmap

  • 22 BIOS-e820ライン
  • 66 EFIメモリライン
  • DMAゾーン:21ページ予約済み
  • メモリ:7882124K/8283384K利用可能

下記のように詳細を読んだ後、add_efi_memmapを追加するかどうかわからない。起動するために絶対に必要ではないように見える余分なことをします。一方、使用可能なメモリのより良い(より完全な)ビューを提供することができます。

EFIスタブブートにこれadd_efi_memmapブート引数を使用する必要があるのはどの場合ですか?アプリケーションで利用可能なEFIスタブのブート速度を上げたり下げたり、空きメモリを増やしたり減らしたりしますか? EFIメモリマップにE820マップよりも多くのエントリが含まれているかどうかを(より適切に)チェックする方法は?


すでに参照されているいくつかのadd_efi_memmepドキュメント:

add_efi_memmap:使用可能な物理RAMのEFIメモリマップを含めます。
EFIメモリマップにE820マップにない追加のエントリがある場合、次のカーネルコマンドラインパラメーターを使用して、利用可能な物理RAMのカーネルメモリマップにそれらのエントリを含めることができます。 。- https://www.kernel.org/doc/Documentation/x86/x86_64/uefi.txt


E820 BIOSメモリマップエントリおよび/またはカーネルコマンドラインmemmapエントリのいずれかを最初に見つけた後、常にEFIメモリマップエントリ(存在する場合)をメモリマップに追加する代わりに、カーネルブートオプションの場合のみ、そのような追加のEFIメモリマップエントリのみを追加します。 :add_efi_memmapが指定されています。 - http://www.gossamer-threads.com/lists/linux/kernel/937817


ブートがフリーズします-GRUBカーネルと初期RAMディスクをロードした後、ブートがエラーメッセージなしでスタックする場合は、削除してみてくださいadd_efi_memmapカーネルパラメータ- https://wiki.archlinux.org/index.php/GRUB#Boot_freezes


このパッチは、現在実行中のカーネルのコマンドラインにadd_efi_memmapオプションが存在する場合のkexecローダーの動作を変更し、/proc/iomemではなく/sys/firmware/memmapからカーネルメモリマップを読み取ります。

EFIシステムでは、e820テーブルが欠落しているか、不完全である場合があります。このようなシステムはadd_efi_memmapオプションを使用して、EFIのメモリテーブルエントリをカーネルのメモリテーブルに追加し、システムのメモリの全体像を構築します。ただし、このオプションを使用しても、/sys/firmware/memmapへの入力に使用されるテーブルにはこれらのエントリは追加されません。

Kexecローダーはデフォルトで初期のメモリマップを使用するため、ローダーがシステムの全体像を把握していない場合に問題が発生し、実際に使用できない場所にカーネルまたはRAMディスクが誤って読み込まれます。この変更により、kexecローダーは実行中のカーネルのコマンドラインでadd_efi_memmapオプションを確認し、見つかった場合は元のマップの代わりに変更されたマップを使用します。 - http://lists.infradead.org/pipermail/kexec/2011-April/005014.html


いくつかの誤ったスタートの後、2009年にLinuxカーネル開発者が到達した解決策(ハック)は、カーネルコマンドラインオプションadd_efi_memmapを追加して、カーネルにEFIメモリマップを調べて使用するように指示することでした。 E820メモリマップのさまざまなエントリを修正します。 - http://blog.fpmurphy.com/2012/08/uefi-memory-v-e820-memory.html

29
Pro Backup

LinuxディストリビューションでEFI STUBが正常に起動した場合は、add_efi_memmapを使用する必要はありません。このカーネルコマンドラインオプションが最近必要になることはほとんどありません-UEFIファームウェアとLinuxカーネルのサポートは、2009年以降大幅に改善されました。

1
fpmurphy

ブートローダー、つまりGrubはe820のようにメモリマップを再構築します。これが、GRUBとEFIスタブローダーの間で異なる値が表示される理由です)。

Linuxソースコードには、EFIで「e820のレガシー(ゼロページ)メモリマップに収まる最大128を超えるエントリを許可する」というコメントが含まれています。これはあなたが投稿した数値によるとそうではないようですので、私はadd_efi_memmapを追加することが役立つとは思えません...しかし、このテーブルを解析することは確かに害にはなりません...

1
falstaff