17

当我遇到 UEFI 这个词时,我正在研究引导加载程序。我可以理解一些关于 UEFI 的事情。但是,带有 UEFI 的系统在什么模式下(Real、Protected、Long)启动?如果正常的引导加载程序无法与 UEFI 一起工作,那么在处理 UEFI 时引导加载程序的替代方案是什么?除了汇编之外,我还需要任何其他编程来创建一个吗?

4

5 回答 5

16

UEFI 固件在 64 位平台上以 64 位长模式运行,在 32 位平台上以平面模式运行;与 BIOS 不同,UEFI 具有自己的体系结构,独立于 CPU 和自己的设备驱动程序。UEFI 可以挂载分区并读取某些文件系统。

当 x86 计算机配备 UEFI 时,该界面会在系统存储中搜索标有特定全局唯一标识符 (GUID) 的分区,该标识符将其标记为 EFI 系统分区 (ESP)。顺便说一句,Windows 不会挂载此分区,您无法在操作系统中看到它。但是有一个技巧,您只需将 VBR 中的分区类型(使用 HexWorkshop)更改为常规 FAT32 代码,它就会被挂载到操作系统中。

此分区包含为 EFI 架构编译的应用程序。一般来说,您不必处理汇编程序来编写 UEFI 应用程序/加载器,它只是一个常规的 C 代码。默认情况下,它位于“EFI/BOOT/BOOTX64.EFI”。当手动或自动选择引导加载程序时,UEFI 会将其读入内存并将引导过程的控制权交给它。

于 2015-08-27T17:01:28.607 回答
7

这是这个问题的一个很好的答案

其他现代 64 位机器具有新的 EFI 固件。这些根本不会从磁盘的扇区#0 加载引导程序。它们通过 EFI 引导管理器加载和运行 EFI 引导加载程序应用程序进行引导。此类程序以保护模式运行。这是 EFI 引导过程。

EFI 固件通常会在退出处理器复位的几条指令内切换到保护模式。切换到保护模式是在 EFI 固件初始化的所谓“SEC 阶段”早期完成的。从技术上讲,32 位和更高版本的 x86 处理器甚至不会在真正的实模式下启动,而是在俗称的虚幻模式下启动。(CS 寄存器的初始段描述符没有描述传统的实模式映射,这就是它“不真实”的原因。)

因此,可以说这些 EFI 系统在本机引导到 EFI 引导加载程序时(即当它们不使用兼容性支持模块时)根本不会正确进入实模式,因为它们直接从虚模式切换到保护模式并从那时起保持保护模式。

于 2015-08-26T18:23:59.063 回答
6
于 2020-05-03T01:05:18.527 回答
2

如果您想进一步了解 UEFI 的工作原理,那么 UEFI 启动后:那它实际上是如何工作的呢?强烈推荐亚当威廉姆森。

他回答了您的问题,并且很好阅读:

现在让我们看看如何在 UEFI 系统上进行引导。即使你没有掌握这篇文章的细节,也要掌握这一点:它是完全不同的。与 BIOS 引导的工作方式完全不同。您不能将您对 BIOS 引导的任何理解应用于本机 UEFI 引导。您无法对专为 BIOS 引导世界设计的系统进行一点调整,并将其应用于本机 UEFI 引导。你需要明白这是一个完全不同的世界。

维基百科页面统一可扩展固件接口也是一个有用的资源。

于 2018-05-02T22:16:26.357 回答
2

当您问“具有 UEFI 的系统在什么模式下(Real、Protected、Long)启动?”时,您是什么意思?处理器开始以类似于过去 80386 的模式的模式执行。但是你真的在乎吗。当您的操作系统加载程序代码获得控制权时,您真的不关心处理器的模式吗?而且您关心为您的操作系统加载程序代码提供了哪些服务。

环境在 UEFI 规范中定义。 UEFI 规范的最新版本

至于您使用哪种语言,最好从汇编开始。稍后使用 C 或其他高级语言可能会更容易。

其他背景:

这里有很多术语,我们在正确使用时并不总是小心翼翼。

当处理器退出复位时执行的代码是系统固件,它对系统中的各种硬件进行大量初始化。

在 UEFI 论坛存在之前的 x86 PC 系统上,系统固件称为 BIOS。那时的 BIOS 会执行其所有的初始化代码,然后从软盘或硬盘上加载一些代码并跳转到代码中。BIOS 还提供了硬件和操作系统之间的一些接口,以帮助将操作系统与硬件差异隔离开来。然而,没有什么是标准化的。唯一的标准是使用 BIOS 接口的操作系统和应用程序级软件。

如果操作系统和应用程序正常运行,则认为 BIOS 是正确的。但是你只能通过没有失败来证明正确性。因此,新的操作系统或应用程序将在一个正确的系统上运行,但在另一个正确的系统上失败。

今天,我们尝试为这些接口提供一些实际的标准化。它们由 UEFI 论坛定义。今天我可以证明我的系统是正确的,符合 UEFI 规范。

当人们说 UEFI 之类的东西时,他们通常指的是安装在系统上的实际系统固件,该固件在操作系统开始执行之前执行。但是我们中的很多人仍然在这些术语周围折腾,就像我们泼了字母汤一样。

引导加载程序实际上是操作系统拥有的代码,由系统固件加载到内存中,系统固件将硬件控制权交给引导加载程序。可以说系统固件的结尾是 UEFI Boot Loader。或者你可以说 BDS 使用系统策略来查找操作系统。你仍然可以找到不同意这些话的人。

于 2015-09-03T07:08:16.220 回答