当在纯UEFI模式下启动时,是谁使A20线可用?

4
这是由UEFI固件处理还是由GRUB的grubx64.efi引导程序处理?我查看了https://wiki.osdev.org/UEFI,它声称:UEFI固件...还使用平面分段准备受保护的模式环境,并为x86-64 CPU提供具有身份映射分页的长模式环境。 A20门也已启用。但是找不到任何官方来源来支持这一信息。UEFI规范没有提到这一点。Linux内核提供了一个efi-stub,可以充当引导加载程序,但在检查其源代码后,我无法确定它是否启用了A20。因此,我仍然不知道这是UEFI固件的工作还是引导加载程序的工作。(我想为UEFI编写自己的引导加载程序,并想了解UEFI固件提供了哪些“开箱即用”的设置,以及必须由我实现哪一部分)
1个回答

5
UEFI固件会在没有启用A20时启用它,使用平面描述符设置GDT,进入保护模式等。在64位CPU上,它还会进入长模式,其中包括启用身份映射分页。为了使UEFI按预期运行,需要启用A20以正确访问所有物理内存。
在一些更现代的处理器上,A20在开机时已经启用,并且可能甚至无法关闭。英特尔已经开始摆脱旧有要求,包括放弃对286之前环境的支持。A20门的存在是为了让286(以及后来的处理器)保持与旧的8086/80186(或等效)处理器的兼容性。无法更改A20状态和放弃遗留BIOS是朝着这个方向迈出的一步。
一旦您的UEFI引导加载程序代码开始运行,可以保证此时A20已启用。从启用它的角度来看,A20只是您不必关心的内容。
虽然UEFI规范中没有明确提到A20,但似乎是暗示了。

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

如果禁用A20,则不是所有段都可以访问所有内存,因此我推断处理器或UEFI固件默认情况下启用了A20。


1
谢谢您的回答!您能否向我推荐一份文件/规范,让我可以了解更多关于UEFI固件在启动时处理的内容?基本上是这些信息的来源 :) - user10607
2
虽然规范没有明确提到A20,但我相信我在更新后的回答中引用的部分暗示了A20必须启用,否则并非所有内存均可从所有段访问。 - Michael Petch
1
我同意这个推理,但是建议这已经由2.3.2的第一部分(针对IA32)和2.3.4(针对X64)暗示了。而且我认为这很重要,因为2.3.x.1实际上是讨论ExitBootServices()之后的状态,而2.3.x则是讨论在那之前的状态(驱动程序、引导程序)。对于IA32而言,这不太清楚,但我认为规定保护模式并且“如果启用了分页模式,则UEFI内存映射定义的任何内存空间都是恒等映射”,以及“选择器被设置为平面,并且不使用其他选择器”将很难在不启用A20的情况下实现。 - unixsmurf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接