3

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

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

UEFI 固件 ... 还准备了一个带有平面分段的保护模式环境,对于 x86-64 CPU,一个带有身份映射分页的长模式环境。A20 门也已启用。

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

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

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

4

1 回答 1

5

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

在一些更现代的处理器上,A20 会在开机时启用,甚至可能无法关闭。英特尔已开始摆脱传统要求,包括放弃支持 pre-286 环境。可以切换的 A20 门的存在是为了使 286(和更高版本的处理器)保持与旧的 8086/80186(或等效)处理器的兼容性。无法更改 A20 状态以及放弃旧版 BIOS 是朝着这个方向迈出的一步。

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

虽然UEFI 规范中没有特别提到 A20 ,但似乎暗示了:

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

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

于 2019-09-01T17:11:19.577 回答