UEFI初识简介
UEFI初识简介
1、UIEFI介绍:
UEFI,全称“统一的可扩展固件接口”(Unified Extensible Firmware Interface):
是一种详细描述类型接口的标准。这种接口用于操作系统自动从预启动的操作环境,加载到一种操作系统上。它方便在硬件发生变更时固件能提供足够的信息保证OS不受影响,包含芯片组和外设芯片驱动程序,通过系统表提供引导时服务和运行时服务。
相比Bios优点:
启动速度和恢复速度快
保护启动,安全性高
模块化设计
支持驱动器容量大,可超2.2TB
1.1、UEFI使用模块化设计,它的逻辑分为硬件控制和OS操作系统软件管理:
硬件—>固件—>UEFI可扩展固件接口—>OS
1.2、UEFI根据它的概念可分为两大部分:
Image(uefi实体)和platform(平台初始化标准框架PI)
Uefi image主要包含三部分:
Uefi application:硬件初始化完,操作系统启动前的核心应用,比如:启动管理、uefi shell、诊断、调度和调试等。
OS Loaders:特殊的uefi application,主要是启动操作系统并退出和关闭uefi应用。
Uefi Drivers:提供设备间接口协议,每个设备独立运行提供设备版本号和相应的参数以及设备间关联,不再需要OS的支持。
平台初始化框架主要包含两部分:
PEI:EFI预初始化,用来检测启动模式、加载主存储器初始化模块、检测和加载驱动执行环境核心
DXE:驱动执行环境(不符合uefi标准的驱动),提供了设备驱动和协议接口环境界面
2、Uefi启动阶段介绍:uefi系统结构层次
uefi启动的7个阶段
2.1、SEC(安全验证Security-Set up Temp memory)
接收和处理系统的启动、重启、异常信号
平台初始化机构起始阶段让硬件平台进入运行C代码的状态
Cache as ram 在Cache上开辟一段空间作为内存使用,因此此时内存还没有初始化, C运行还需要内存和栈空间
传递系统参数给PEI阶段
处理可弃用的固件的地址和大小
2.2、PEI(EFI前期初始化和Pre-EFI-Initialize memory)
紧随SEC阶段,平台处于初始化状态初期,仅有片内资源cache/sram,调度PEIM (pei mpdule)执行,主要为DXE阶段准备执行环境,主要做CPU的硬件初始化,最主要的是内存的初始化,将DXE所需的信息在HOB(Hand-off-blocks,PEI阶段发现的所有资源信息)列表的形式进行封装传递给DXE阶段
2.3、DXE(驱动执行环境 Driver Execution -Dispatch List of UEFI/DXE Drivers)
执行系统的大部分驱动初始化工作,在DXE阶段已有足够的内存使用,DXE在主存中执行,因此可以完成大量的驱动加载和初始化工作,遍历固件中的所有driver,当driver所依赖的资源都满足要求时,调度driver到执行队列中执行,直到所有的driver都被加载和执行完毕系统初始化完成
2.4、BDS(启动设备选择Boot Device Selection -run Setup)
BDS和DXE一起工作,从预设和用户选择的设备启动操作系统,BDS之后控制权交给了操作系统,主要初始化控制台设备,加载执行必要的设备驱动,根据用户的选择执行相应的启动项
2.5、TSL(操作系统加载前期)
OS Loader执行的第一个阶段,为OS Loader准备执行环境,OS Loader调用ExitBootService结束启动服务进入RunTime服务
2.6、RT(运行时服务)
Os Loader已经完全取得了系统的控制权,因此清理回收一些之前被uefi占用的资源,RunTime随着操作系统的运行提供运行时服务,这期间一旦出现错误和异常就进入AL进行修复
2.7、AL(灾难回复)
根据厂家自定义修复方案,uefi标准未进行规定
3、Uefi设计结构:(后面细讲)
3.1、Protocol (协议):
就是一个uefi标准定义的结构体
3.2、Handle(句柄):
就是一个逻辑设备一个handle可以挂多个protocol
3.3、Guid(唯一标识):
protocol生成的一个唯一标识,国际唯一,生成网站 https://www.guidgen.com/
3.4、Uefi主要以包(package)和模块(module)划分:
一个包下可以有多个模块,每个模块中都有inf工程配置文件来编译模块,有dec文件声明对外公开的数据和接口,若是这个包要独立编译,要有dsc描述文件来生成固件image,也是由这个文件的描述来决定image中所需模块来启动image,一个image文件代表一个模块, 在镜像中要编译这模块就将它加到编译文件的dsc和fdf中
3.5、Inf:
用于编译一个模块可执行文件.efi
3.6、Dsc:
用于编译一个包
3.7、Dec:
文件定义了公开的数据和接口给你个其他模块使用
3.8、Fdf:
用于生成固件imageoptionromimage或可以启动image它是构成uefgi二进制(镜像)
的描述符