UEFI启动过程
UEFI背景介绍
UEFI(Unified Extensible Firmware Interface,统一可扩展固件接口)是一种现代化的固件接口标准,用于替代传统的BIOS(Basic Input/Output System)。UEFI提供了更强大的功能和灵活性,支持更大的硬盘、更快的启动速度以及更安全的启动过程。与BIOS相比,UEFI具有以下优势:
- 支持大容量硬盘:UEFI使用GPT(GUID分区表),支持超过2TB的硬盘。
- 更快的启动速度:UEFI通过并行初始化硬件设备,显著缩短了启动时间。
- 安全性增强:UEFI支持安全启动(Secure Boot),防止恶意软件在启动过程中加载。
- 模块化设计:UEFI采用模块化设计,便于扩展和更新。
UEFI启动过程从加电到关机分为7个阶段,每个阶段都有特定的任务和功能。以下是每个阶段的详细介绍。
UEFI启动过程的7个阶段
1. SEC(安全验证,Security Phase)
功能:
- 这是UEFI启动的第一个阶段,主要负责系统的初始化和安全验证。
- 在加电后,CPU从复位向量开始执行,首先进入SEC阶段。
- 该阶段的主要任务是验证固件的完整性和安全性,确保系统没有被恶意篡改。
- SEC阶段还会初始化一些关键的硬件资源,如CPU缓存和临时内存(Cache-as-RAM, CAR),以便后续阶段可以使用。
关键任务:
- 验证固件的完整性(如使用数字签名)。
- 初始化临时内存(CAR)。
- 为PEI阶段准备执行环境。
2. PEI(EFI前期初始化,Pre-EFI Initialization)
功能:
- PEI阶段的主要任务是初始化系统的关键硬件组件,如内存控制器、CPU和芯片组。
- 该阶段会加载和执行PEIM(PEI模块),这些模块负责初始化硬件并传递信息给后续阶段。
- PEI阶段还会检测和初始化系统内存,为DXE阶段提供可用的内存资源。
关键任务:
- 初始化内存控制器和系统内存。
- 加载和执行PEIM模块。
- 传递硬件信息给DXE阶段。
3. DXE(驱动执行环境,Driver Execution Environment)
功能:
- DXE阶段是UEFI启动过程中最复杂的阶段,负责加载和执行大量的驱动程序和服务。
- 该阶段会初始化系统中的大部分硬件设备,并为操作系统提供运行时服务。
- DXE阶段会加载DXE驱动程序,这些驱动程序负责初始化硬件设备(如显卡、存储设备、网络设备等)。
- 该阶段还会初始化UEFI的核心服务,如Boot Services和Runtime Services。
关键任务:
- 加载和执行DXE驱动程序。
- 初始化硬件设备。
- 提供UEFI Boot Services和Runtime Services。
4. BDS(启动设备选择,Boot Device Selection)
功能:
- BDS阶段的主要任务是选择合适的启动设备并加载操作系统。
- 该阶段会枚举系统中的所有启动设备(如硬盘、USB设备、网络设备等),并根据用户配置或默认设置选择启动设备。
- BDS阶段会加载操作系统的引导程序(如Windows的Bootmgr或Linux的GRUB),并将控制权交给引导程序。
关键任务:
- 枚举启动设备。
- 选择启动设备。
- 加载操作系统的引导程序。
5. TSL(操作系统前期加载,Transient System Load)
功能:
- TSL阶段是操作系统加载前的过渡阶段,负责为操作系统提供必要的运行时环境。
- 该阶段会继续提供UEFI Boot Services,直到操作系统完全加载并接管系统。
- 在操作系统加载过程中,UEFI Boot Services会被逐步关闭,操作系统会初始化自己的运行时环境。
关键任务:
- 提供UEFI Boot Services。
- 过渡到操作系统加载阶段。
6. RT(运行时,Runtime)
功能:
- RT阶段是操作系统运行时的阶段,UEFI的Runtime Services会继续为操作系统提供服务。
- 这些服务包括时间管理、硬件抽象、系统配置等。
- 在操作系统运行时,UEFI的Boot Services已经被关闭,但Runtime Services仍然可用。
关键任务:
- 提供UEFI Runtime Services。
- 支持操作系统的运行时需求。
7. AL(系统灾难恢复期,After Life)
功能:
- AL阶段是系统关机或出现灾难性错误后的恢复阶段。
- 该阶段负责处理系统的关机流程或灾难恢复操作。
- 在系统关机时,UEFI会执行一些清理操作,确保系统安全关闭。
- 如果系统出现严重错误,UEFI可能会尝试恢复系统或提供错误信息以便诊断。
关键任务:
- 处理系统关机流程。
- 灾难恢复操作。
UEFI启动过程从加电到关机分为7个阶段,每个阶段都有特定的任务和功能。这些阶段共同协作,确保系统能够安全、可靠地启动并运行操作系统。UEFI的设计使得系统启动过程更加模块化和灵活,支持更多的硬件设备和操作系统。
UEFI映像、应用程序、引导加载器及Rust开发
UEFI映像
UEFI映像是指符合UEFI规范的可执行文件,通常以.efi
为扩展名。这些映像可以是操作系统引导加载器、驱动程序或应用程序。UEFI映像的特点包括:
- PE/COFF格式:UEFI映像采用Windows的可移植可执行文件(PE/COFF)格式,确保跨平台兼容性。
- 独立运行:UEFI映像可以直接在UEFI环境中运行,无需操作系统的支持。
- 模块化设计:UEFI映像通常以模块化的方式设计,便于扩展和维护。
常见的UEFI映像包括:
- 引导加载器:如Windows的bootmgfw.efi
或Linux的grubx64.efi
。
- 驱动程序:如硬盘控制器驱动或网络驱动。
- 应用程序:如系统配置工具或诊断工具。
UEFI应用程序
UEFI应用程序是运行在UEFI环境下的独立程序,通常用于系统配置、硬件诊断或引导管理。UEFI应用程序的特点包括:
- 直接访问硬件:UEFI应用程序可以直接访问硬件资源,如内存、存储设备和网络接口。
- 使用UEFI服务:UEFI应用程序可以通过UEFI Boot Services和Runtime Services与系统交互。
- 独立于操作系统:UEFI应用程序在操作系统加载之前运行,适用于系统初始化或故障排查。
常见的UEFI应用程序包括:
- Shell应用程序:如UEFI Shell,提供命令行界面以执行脚本或加载其他映像。
- 诊断工具:如内存测试工具或硬件信息查看工具。
- 引导管理器:如bcfg
命令,用于配置启动项。
UEFI引导加载器
UEFI引导加载器是负责加载操作系统的UEFI映像。它的主要任务包括:
- 加载操作系统内核:从启动设备中读取操作系统内核并将其加载到内存中。
- 传递启动参数:将必要的启动参数(如内存布局、硬件信息)传递给操作系统。
- 支持多操作系统:通过启动菜单或配置文件支持多个操作系统的引导。
常见的UEFI引导加载器包括: - Windows Boot Manager:用于加载Windows操作系统。 - GRUB:用于加载Linux操作系统。 - rEFInd:用于加载多种操作系统,支持图形化界面。
Rust在UEFI开发中的使用
Rust是一种现代系统编程语言,具有内存安全和并发安全的特性,非常适合用于UEFI开发。以下是Rust在UEFI开发中的关键点:
1. 入口点
在Rust中编写UEFI应用程序时,需要定义一个符合UEFI规范的入口点函数。通常使用#[no_mangle]
和extern "efiapi"
来确保函数符合UEFI的调用约定。
示例:
#[no_mangle]
pub extern "efiapi" fn efi_main(image_handle: uefi::Handle, system_table: *mut uefi::SystemTable) -> uefi::Status {
// 初始化UEFI服务
uefi_services::init(&system_table).unwrap();
// 打印Hello World
println!("Hello, UEFI World!");
uefi::Status::Success
}
2. OVMF固件制作
OVMF(Open Virtual Machine Firmware)是一个开源的UEFI固件实现,支持在虚拟机中运行UEFI应用程序。Rust开发者可以使用OVMF进行开发和测试。
编译OVMF:从源码编译OVMF固件,或直接下载预编译的二进制文件。
配置虚拟机:将OVMF固件配置为虚拟机的BIOS,并加载UEFI应用程序进行测试。
3. Protocol的概念
在UEFI中,Protocol是一种接口或服务,用于访问硬件或系统功能。Rust通过uefi-rs库提供了对UEFI Protocol的支持。
示例:
use uefi::proto::console::text::Output;
fn main() {
let stdout = system_table.stdout();
stdout.clear_screen().unwrap();
stdout.output_string("Hello, UEFI Protocol!").unwrap();
}
UEFI图形界面
UEFI支持图形化界面(Graphical User Interface, GUI),称为UEFI图形输出协议(GOP,Graphics Output Protocol)。通过GOP,UEFI可以在启动过程中显示图形界面,提供更友好的用户体验。
1. 图形输出协议(GOP)
GOP是UEFI中用于管理图形输出的协议,支持以下功能:
设置显示模式:设置分辨率、颜色深度等显示参数。
绘制图形:支持绘制像素、线条、矩形等基本图形。
显示文本:支持在图形模式下显示文本。
2. 图形化引导管理器
一些UEFI实现(如rEFInd)支持图形化引导管理器,提供以下功能:
启动菜单:以图形化方式显示可用的操作系统或启动项。
图标和背景:支持自定义图标和背景图片,提升用户体验。
鼠标支持:支持鼠标操作,方便用户选择启动项。
3. 开发图形化UEFI应用程序
开发者可以使用GOP开发图形化UEFI应用程序,例如:
系统配置工具:提供图形化界面以配置系统设置。
诊断工具:以图形化方式显示硬件信息或测试结果。
引导管理器:提供图形化启动菜单。
示例(伪代码):
use uefi::proto::console::graphics::GraphicsOutput;
fn main() {
let gop = system_table.locate_protocol::<GraphicsOutput>().unwrap();
gop.set_mode(0).unwrap(); // 设置显示模式
gop.clear_screen(Color::Blue).unwrap(); // 清屏并设置背景颜色
gop.draw_text(100, 100, "Hello, UEFI GUI!").unwrap(); // 显示文本
}