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