支持 EFI 的设备就可以随便刷机。
系统启动有三个过程:EFI/BIOS/bootloader (负责硬件初始化)-> grub (可选,启动引导程序)-> OS 。
略过 grub ,毕竟这个是可选的。只考虑 EFI/BIOS/bootloader -> OS 。
各个 OS ,比如 Linux ,它的启动流程是标准的,只要在运行 kernel 前往特定的 RAM 地址塞启动信息(比如内核参数)就行了。
那么问题来了:
1. Q:OS 启动后怎么知道它有哪些硬件?
A:PCI/PCIe 是一个标准,可以枚举;但是 PCI/PCIe 需要 CPU 集成控制器,嵌入式 CPU 几乎都没有这东西,所以使用的是 device tree (预先定义好硬件信息当作内核参数传给 kernel )。
2. Q:启动是分阶段的,至少存在两个阶段:1. 系统关闭状态到 EFI/BIOS/bootloader 启动; 2. EFI/BIOS/bootloader 到 OS 。阶段 1 怎么把启动信息穿递给阶段 2 ?
A:我理解的是这样:OS kernel 有自己的启动协议,传统的 BIOS (至少 10 年前了,现在的 BIOS 视为 UEFI )与 bootloader 是去兼容 OS kernel 的启动协议; EFI 是 OS kernel 去兼容 EFI 协议,EFI 版本的 bootloader/UEFI 实现了这个 EFI 协议。
为什么 ARM 刷机这么复杂?是 device tree 的原因,除了 arm server 外罕有支持 EFI 的 arm ,而 device tree 需要根据硬件定制的;并且使用了 device tree 的芯片几乎不会与 EFI 搭配使用。
好消息是 ARM 推出了 system ready spec:
https://www.arm.com/architecture/system-architectures/systemready-certification-program也许未来 ARM 会与 x86 一样可以使用 efi 方便地刷机了。