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