[UEFI] 关于 UEFI 的研究

本文结合实际实现分析。

现在的主板BIOS都是UEFI BIOS,但依然支持 传统引导(Legacy Boot),原因在 UEFI BIOS 做了 CSM 兼容处理,而不能说是内置了 UEFI 和 Legacy 两个 BIOS。
现在一般称 UEFI BIOS 为 BIOS,称不支持 UEFI 的为 Legacy Boot。
如无特指,下称 UEFI BIOS 为 BIOS,操作系统为 OS

支持多引导启动

UEFI 支持多系统启动,一般提供了 UEFI 启动项快捷键(俗称 U 盘启动快捷键)。

如台式技嘉主板 BIOS 为 F12
如笔记本神舟/炫龙主板 BIOS 为 F7

传统引导

传统启动:
传统引导 是把记录到 MBR(Master Boot Record) ,但是更改分区就会修改 DPT分区表 导致引导丢失(格式化分区不影响),Windows7 启动流程:Lecacy BIOS–>MBR–>DPT–>PBR(记录着OS的引导)–>{Bootmgr->BCD文件->Winload.exe}

传统引导不支持原生多引导,因为 分区表大小是有限的,如果要支持多引导,只能让 PBR 指向一个启动菜单管理器如 grub4dos ,然后通过这个管理器再去选择启动其他系统。

UEFI 引导

而 UEFI 引导采用文件式,这也是能够支持原生多引导的基础。

EFI 分区,是一个带有特殊 ID 的 FAT 分区。
开机时,UEFI BIOS 初始化,然后读取并执行 EFI 分区内的 efi 文件,之后就一般是操作系统内核的链式启动了(如Windows的启动过程:BIOS-->ESP分区-->bootxxx.efi-->{Bootmgr-->加载BCD文件-->读取winload.efi})

各主板厂家设计稍有差异,并不会完全遵循 UEFI 标准。
例如 技嘉带图形界面BIOS的台式主板(启动项快捷键 F12):
他们就设计为 扫描到多少个 FAT 分区就显示为多少个启动项,并以储存设备名作为启动项名。

只需要在 移动USB储存设备上的一个 EFI 分区上放置一个可引导文件如 /EFI/Boot/bootx64.efi,即可通过主板 BIOS 快捷键启动
EFI 分区一般为FAT 系文件系统(FAT12~32,exFAT需要看厂家是否支持,小部分厂家还支持 NTFS 等其他文件系统作为 EFI 区)

注意:
一般 BIOS 为了安全,在本地已有 OS 引导的情况下,不会把本地硬盘上的 FAT 分区识别为启动项,而是要求本地操作系统把启动项储存在主板里。(非本地盘如 U 盘一般不受影响)
而面向用户的 Linux 操作系统一般通过 efiboot 工具来添加 UEFI 启动项;
附上:常见读写 UEFI 启动项的工具有efiboot(*nix)、EasyUEFI(Windows)
但具体储存在哪里好像无从考证,少数外文资料提到本机记录启动项是存放在主板 NVRAM 中,也有资料提到这个 NVRAM 只是一种概念标准,物理实现上并无标准规定。

分析

两种引导只在实现上有区别,但原理都是链式启动。
UEFI 是时代的进步,当然推荐搭配同样先进 GPT。UEFI不只是把引导方式改为了文件式,还做了全方面的革新。
传统引导是汇编语言时代,各计算机硬件厂商各都有不同的实现,累死做 OS 底层接口对接的人。
UEFI 是 c 语言时代,各计算机硬件厂商只需要按照 UEFI 提供的接口做好对接即可。

拓展

  1. 当然传统启动(Legacy Boot)也可以使用 UEFI,现在已有通过软件实现的 UEFI 启动器。(基于计算机组成原理中软件硬件均可实现相同功能的原理).
  2. 另外还有重建/模拟 EFI 内存环境实现仿冒硬件的功能。(如 OpenCore 模拟正版的 Mac 硬件产生的 EFI 内存环境,并制作内核拓展进行驱动协调,以实现安装黑苹果)
  3. UEFI 并无规定一定要使用 GPT(GUID) 分区表,很多操作系统如 Windows macOS 的最小化安装盘依然是 MBR + FAT 分区作为 UEFI 启动,但有些 OS 明确只能使用 GPT,如 Linux
  4. efi文件是PE格式的
  5. Windows10 的激活验证是通过网络上传你主板的 id 等信息来实现验证的

参考:

  1. MBR分区表详解
posted @ 2020-07-21 14:37  蓝天上的云℡  阅读(592)  评论(0编辑  收藏  举报