「UEFI」- 原理与结构

  CREATED BY JENKINSBOT

启动流程(广义)

What is UEFI’s boot sequence? – Stack Overflow

流程概述

在 UEFI 中,当运行时,按照如下程序来启动操作系统:

UEFI Firmware        // 1)查找 FAT32 分区(通常 100M 左右,对大小无具体要求),并被是作为 EFI 启动项目而出现在启动菜单,
     |               // 2)当用户选择某个菜单项后,固件在其中查找 /EFI/Boot/Boot.efi(BootX64.efi)文件,并运行
     |               // 主板的 UEFI Firmware 仅识别 efi 格式的文件
     |
     V
 OS Loader           // 3)Boot.efi 加载 os-kernel.elf 文件,并加载到内存并运行;
     |               // 这里的 BootX64.efi 便是 OS Loader(负责运行操作系统),其为 efi 格式,由操作系统厂商实现;
     |               // 此外,UEFI 提供相关的服务(接口),供开发者在 BootX64.efi 中调用;
     |
     V
 OS Kernel           // 4)操作系统内核开始运行,后续工作交由内核来处理
                     // 此外,在 UEFI 内,仅提供硬件的基本驱动,想要发挥硬件的最高性能,需要在操作系统内安装相关驱动程序;


                     // 参考 UEFI Specification 文档,获取更多细节说明;

操作实践

Check if Your Computer Uses UEFI or BIOS [in Linux & Windows]
FAT – ArchWiki

接下来,我们要在操作系统中开始探索 UEFI 相关内容,以验证前面的内容。

检查操作系统是否以 UEFI 模式启动:

// Linux

# ll /sys/firmware/efi
ls: cannot access '/sys/firmware/efi': No such file or directory                // 表示操作系统没有使用 UEFI 启动

# apt-get install efibootmgr
# efibootmgr
EFI variables are not supported on this system.                                 // 表示操作系统没有使用 UEFI 启动

查看 FAT32 分区:

# file -s /dev/sda1
/dev/sda1: DOS/MBR boot sector, code offset 0x58+2, OEM-ID "mkfs.fat", sectors/cluster 8, Media descriptor 0xf8, sectors/track 63, heads 255, hidden sectors 2048, sectors 1048576 (volumes > 32 MB), FAT (32 bit), sectors/FAT 1024, reserved 0x1, serial number 0xd13347f5, unlabeled

# df -h /dev/sda1 
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       511M  5.3M  506M   2% /boot/efi                                 // 通常 Linux 将其挂载到 /boot/efi 目录

# tree /boot/efi/
/boot/efi/
└── EFI
    ├── BOOT
    │   ├── BOOTX64.EFI
    │   ├── fbx64.efi
    │   └── mmx64.efi
    └── ubuntu
        ├── BOOTX64.CSV
        ├── grub.cfg
        ├── grubx64.efi
        ├── mmx64.efi
        └── shimx64.efi

3 directories, 8 files

ESP, EFI System Partition

前面提到的 FAT32 分区,在 ESP 中的术语为 ESP,其规范是基于 FAT file system(即与原始 FAT Specification 是无关的)。

针对 ESP 部分,每个系统厂商,虽然都遵循 UEFI Specification 要求,但是都有不同程度的出入:
1)Apple 维护独立的工具来处理 ESP 分区;
2)其他操作系统通常直接使用 FAT 工具集;

UEFI and GPT

由于 GPT 是 EFI 规范的一部分,所以如果电脑使用 EFI,那从 GPT 启动很简单。

基于 UEFI 的系统,只能从 GPT 风格的磁盘启动。

传统 BIOS 可以从 MBR 风格的磁盘中启动,某些场景下也能够从 GPT 风格磁盘启动。

UEFI 也提供 BIOS 支持。

参考文献

EFI system partition – Wikipedia