在纯UEFI中启动时,谁启用A20线路?

use*_*607 3 x86 grub x86-64 bootloader uefi

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

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

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

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

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

(我想为UEFI编写自己的引导程序,并想了解UEFI固件提供了“开箱即用”的设置以及我必须实现的部分)

Mic*_*tch 5

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。

  • @ user10607:尽管规范没有特别提到A20,但我相信我在更新后的答案中引用的那部分暗示必须启用A20,否则并非所有段都可以访问所有内存。 (2认同)