启动流程(广义)
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