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

我看着https://wiki.osdev.org/UEFI声称:

UEFI固件...还准备了具有平面分段的受保护模式环境,并为x86-64 CPU准备了具有身份映射分页的长模式环境。 A20门也被启用。

但是找不到任何官方来源来备份此信息。 UEFI规范没有提及这一点。

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

(我想为UEFI编写自己的Bootloader,并想了解UEFI固件提供的“开箱即用”设置是什么,我必须实现哪些部分)

最佳答案

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

在一些更现代的处理器上,A20会在开机时启用,甚至可能无法关闭。英特尔已经开始摆脱遗留的要求,包括放弃对286之前的支持环境。出现了可以切换的A20门,因此286(及更高版本的处理器)将保持与较早的8086/80186(或等效产品)处理器的兼容性。无法更改A20状态以及放弃旧版BIOS就是朝这个方向迈进的一步。

UEFI引导加载程序代码开始运行后,可以确保在此时启用A20。从启用它的角度来看,A20只是您自己不关心的事情。

尽管UEFI specification中未特别提及A20,但这似乎暗示了:

2.3.2.1切换状态
加载32位UEFI操作系统后,系统固件将控制权以平面32位模式移交给操作系统。所有
将描述符设置为其4GiB限制,以便可以从所有段访问所有内存。

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

10-05 18:15