何时需要在 UEFI/EFI 启动中指定 add_efi_memmap 作为内核参数?

何时需要在 UEFI/EFI 启动中指定 add_efi_memmap 作为内核参数?

我正在阅读一些如何通过 EFI 存根 (efistub) 加载 Linux 内核的教程。这些指令经常使用内核引导参数add_efi_memmap。预期的硬件是具有 8GB RAM 的 Intel x64。我当前的设置正在运行grub-efi引导加载程序和内核 v3.13。

GRUB启动没有启动参数add_efi_memmap

  • 23BIOS-e820 行dmesg | grep BIOS-e820: | wc -l
  • 243EFI 内存行dmesg | grep efi:\ mem | wc -l
  • DMA 区域:24保留页
  • 内存:7840568K/8283384K可用
  • 442816K 保留

GRUB启动 add_efi_memmap并且 EFI 内存映射大小似乎有所不同:

  • 23BIOS-e820线
  • 57EFI内存线
  • DMA 区域:22保留页
  • 内存:7885076K/8283384K可用
  • 398308K 保留

EFI存根启动没有 add_efi_memmap:

  • 22BIOS-e820线
  • 60EFI内存线
  • DMA 区域:21保留页
  • 内存:7885012K/8283384K可用

EFI存根启动 add_efi_memmap:

  • 22BIOS-e820线
  • 66EFI内存线
  • DMA 区域:21保留页
  • 内存:7882124K/8283384K可用

阅读更多信息后 - 如下内联 - 我不知道是否添加add_efi_memmap。它做了一些额外的事情,这似乎对于启动来说并不是绝对必要的。另一方面,它可以提供可用内存的更好(更完整)的视图。

在什么情况下应该这样做添加_efi_memmapboot 参数可用于 EFI 存根引导吗?这会增加/降低 EFI 存根启动速度,并增加或减少可供应用程序使用的可用内存吗?如何(更好地)检查我的 EFI 内存映射是否包含比 E820 映射更多的条目?


已经查阅了一些 add_efi_memmep 文档:

添加_efi_memmap :包括可用物理 RAM 的 EFI 内存映射。
如果 EFI 内存映射具有 E820 映射中没有的其他条目,您可以使用以下内核命令行参数将这些条目包含在可用物理 RAM 的内核内存映射中。 -https://www.kernel.org/doc/Documentation/x86/x86_64/uefi.txt


在最初找到 E820 BIOS 内存映射条目和/或内核命令行内存映射条目后,不要总是将 EFI 内存映射条目(如果存在)添加到内存映射,而是仅在内核启动选项存在时才添加此类附加 EFI 内存映射条目:add_efi_memmap已指定。 -http://www.gossamer-threads.com/lists/linux/kernel/937817


启动冻结- 如果在 GRUB 加载内核和初始 ramdisk 后启动卡住且没有任何错误消息,请尝试删除 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 加载程序默认使用原始内存映射,当加载程序没有完整的系统图并在实际上不可用的位置错误加载内核或 ramdisk 时,这会导致问题。此更改使 kexec 加载程序检查正在运行的内核的命令行中的选项add_efi_memmap,如果找到它,将使用修改后的映射而不是原始映射。 -http://lists.infradead.org/pipermail/kexec/2011-April/005014.html


Linux 内核开发人员在多次失败后于 2009 年找到了解决方案(hack),即添加一个内核命令行选项,add_efi_memmap告诉内核查看 EFI 内存映射并使用它来修复各种条目在E820内存映射中。 -http://blog.fpmurphy.com/2012/08/uefi-memory-v-e820-memory.html

答案1

引导加载程序(或 Grub)会像 e820 一样重建内存映射,我想这就是您在 GRUB 和 EFI 存根加载程序之间看到不同值的原因。

Linux 源代码中有一条注释说 EFI 允许“超过 e820 旧版(零页)内存映射中可以容纳的最大 128 个条目”。根据您发布的数字,情况似乎并非如此,因此我怀疑添加 add_efi_memmap 是否有帮助...但是,解析此表当然也没有什么坏处...

答案2

如果您的 Linux 发行版成功启动 EFI STUB,则无需使用 add_efi_memmap。现在很少需要这个内核命令行选项 - UEFI 固件和 Linux 内核对其的支持自 2009 年以来已经显着改进。

相关内容