谁在纯 UEFI 中启动时启用 A20 行?

Who enables the A20 line when booting in pure UEFI?

这是由 UEFI 固件处理还是由 GRUB grubx64.efi 引导加载程序处理?

我查看了 https://wiki.osdev.org/UEFI,它声称:

UEFI firmware ... also prepares a protected mode environment with flat segmentation and for x86-64 CPUs, a long mode environment with identity-mapped paging. The A20 gate is enabled as well.

但找不到任何官方 来源来支持此信息。 UEFI规范没有提到这个。

linux 内核提供了一个可以作为引导程序的 efi-stub,但是在检查了它的源代码后我看不出它是否启用了 A20。所以我仍然不知道它是UEFI固件的工作还是引导加载程序的工作。

(我想为 UEFI 编写自己的引导加载程序,并想了解 UEFI 固件提供了哪些设置 "out of the box" 以及哪些部分必须由我实现)

UEFI 固件启用 A20(如果尚未启用)、使用平面描述符设置 GDT、进入保护模式等。在 64 位 CPUS 上,它还会进入长模式,其中涉及启用身份映射分页。为了让 UEFI 按预期运行,它需要启用 A20 以正确访问所有物理内存。

在一些更现代的处理器上,A20 在开机时启用,甚至可能无法关闭。英特尔已开始摆脱遗留要求,包括放弃支持 pre-286 环境。可以切换的 A20 门的存在是为了让 286(和更高版本的处理器)保持与旧的 8086/80186(或同等)处理器的兼容性。无法更改 A20 状态以及放弃旧版 BIOS 是朝着这个方向迈出的一步。

一旦您的 UEFI 引导加载程序代码启动 运行,您可以保证此时将启用 A20。 A20只是从启用的角度来说你并不关心。

虽然UEFI specification中没有特别提到A20,但似乎暗示:

2.3.2.1 Handoff State When a 32-bit UEFI OS is loaded, the system firmware hands off control to the OS in flat 32-bit mode. All descriptors are set to their 4GiB limits so that all of memory is accessible from all segments.

禁用 A20 后,并非所有内存都可以从所有段访问,因此我推断必须在处理器或 UEFI 固件中默认启用 A20。