这是由UEFI固件还是由GRUB grubx64.efi
引导加载程序处理?
我看着https://wiki.osdev.org/UEFI声称:
UEFI固件...还准备了具有平面分段的保护模式环境,并为x86-64 CPU准备了具有身份映射分页的长模式环境。A20门也被启用。
但找不到任何官方资源来备份此信息。UEFI规范没有提及这一点。
linux内核提供了一个efi-stub,可以用作引导加载程序,但是在检查了其源之后,我看不到它是否启用了A20。因此,我仍然不知道它是UEFI固件的工作还是Bootloader的工作。
(我想为UEFI编写自己的引导程序,并想了解UEFI固件提供了“开箱即用”的设置以及我必须实现的部分)
UEFI固件会启用A20(如果尚未启用),使用平面描述符设置GDT,进入保护模式等。在64位CPUS上,它还会进入long模式,这涉及启用身份映射分页。为了使UEFI能够按预期运行,需要启用A20以正确访问所有物理内存。
在一些更现代的处理器上,A20会在开机时启用,甚至可能无法关闭。英特尔已开始摆脱遗留的要求,包括放弃对286之前的支持环境。出现了可以切换的A20门,因此286(及更高版本的处理器)将保持与较旧的8086/80186(或等效处理器)的兼容性。无法更改A20状态以及丢弃旧版BIOS就是朝这个方向迈进的一步。
UEFI引导加载程序代码开始运行后,可以确保在此时启用A20。从启用它的角度来看,A20只是您自己不关心的事情。
尽管UEFI规范中未特别提及A20 ,但似乎暗示了:
2.3.2.1切换状态 加载32位UEFI OS时,系统固件将控制权以平面32位模式移交给OS 。所有描述符都设置为其4GiB限制,以便可以从所有段访问所有内存。
禁用A20后,并非所有段都可以访问所有内存,因此我推断必须默认在处理器或UEFI固件中启用A20。