X86 在纯UEFI中引导时,谁启用A20线路?

X86 在纯UEFI中引导时,谁启用A20线路?,x86,x86-64,bootloader,uefi,grub,X86,X86 64,Bootloader,Uefi,Grub,这是由UEFI固件处理还是由GRUBgrubx64.efibootloader处理 我查看了哪些声明: UEFI固件。。。还为x86-64 CPU准备了具有平面分段的保护模式环境,以及具有标识映射分页的长模式环境。A20门也已启用 但找不到任何官方来源来备份此信息。UEFI规范没有提到这一点 linux内核提供了一个efi存根,可以作为引导加载程序,但在检查其源代码后,我看不出它是否启用A20。所以我仍然不知道这是UEFI固件的工作还是引导加载程序的工作 (我想为UEFI编写自己的引导加载程序,

这是由UEFI固件处理还是由GRUB
grubx64.efi
bootloader处理

我查看了哪些声明:

UEFI固件。。。还为x86-64 CPU准备了具有平面分段的保护模式环境,以及具有标识映射分页的长模式环境。A20门也已启用

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

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


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

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

在一些更现代的处理器上,A20在通电时启用,甚至可能无法关闭。英特尔已开始摆脱传统要求,包括放弃对286之前环境的支持。A20门可以切换,这样286(以及更高版本的处理器)将保持与旧的8086/80186(或同等)处理器的兼容性。无法更改A20状态,以及放弃传统BIOS都是朝着这个方向发展的

一旦您的UEFI引导加载程序代码开始运行,您就可以保证A20将在此时启用。从启用A20的角度来看,A20只是你不关心的事情

虽然A20未在本手册中明确提及,但似乎暗示:

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


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

谢谢您的回答!您能否向我推荐一份文档/规范,让我可以阅读更多有关UEFI固件在引导时处理的内容?基本上,这些信息的来源是:)@user10607:虽然规范没有特别提到A20,但我相信我现在在更新的答案中引用的部分推断,A20必须启用,否则并非所有内存都可以从所有段访问。我同意这个推论,但这表明2.3.2(对于IA32)和2.3.4(对于X64)的第一部分已经暗示了这一点。我认为这是相关的,因为2.3.x.1实际上讨论了ExitBootServices()之后的状态,而2.3.x甚至讨论了ExitBootServices()之前的状态(驱动程序、引导加载程序)。对于IA32,这一点不太清楚,但我认为强制保护模式和“如果启用了分页模式,UEFI内存映射定义的任何内存空间都是标识映射的”以及“选择器设置为平坦,否则不使用”的组合在不启用A20的情况下很难实现。