UEFI 执行流程学习

UEFI系统的启动遵循UEFI平台初始化标准,从加电到关机可以分为7个阶段:SEC(安全验证)--> PEI(EFI前期初始化)→ DXE(驱动执行环境)→ BDS(启动设备选择)→ TSL(操作系统加载前期)→ RT(Run Time) → AL (系统灾难恢复期)。

SEC的执行可以分为两个阶段:Reset Vector阶段 和 SEC入口函数阶段。Reset Vector阶段主要是一些汇编代码,用于设置相关寄存器,该阶段系统还没有RAM,因而不能使用基于栈的程序设计,所有的函数调用都使用jmp指令模拟。在该阶段的最后会调用SEC入口函数。在SEC入口函数阶段,栈已经初始化完成,可以使用C代码进行编程,在该阶段中会去查找PeiCore镜像的入口地址,该地址是下一阶段(PEI阶段)的入口函数地址。最终SEC要把控制权转交给PEI,同时要将现阶段的相关信息作为参数传递给PEI的入口函数,包括:临时RAM区域、栈区域、可启动固件的地址和大小等信息。

PEI阶段的执行可以分为两部分,即PEI内核的执行和PEIM派遣器的执行,其中PEIM是指PEI Module。PEI内核主要负责PEI基础服务和流程。PEIM派遣器主要功能是找出系统中的所有PEIM,并根据PEIM之间的依赖关系按顺序执行PEIM。PEI阶段对系统的初始化主要是由PEIM完成的。


与PEI类似,从功能上将,DXE可以分为DXE内核和DXE派遣器两部分,DXE内核负责DXE基础服务和执行流程。DXE派遣负责调度执行DXE驱动,初始化系统设备。

BDS阶段的主要功能是执行启动策略,这里的启动策略相对比较灵活,可以针对自己的平台开发对应的启动流程。BDS策略通过全局NVRAM变量配置,这些变量可以通过运行时服务的GetVariable()读取,通过SetVariable()设置。其中,变量BootOrder定义了启动顺序,变量Boot####定了各个启动项(####是4个16进制大写符号)。通过参考OVMF的执行流程可以实现基于qemu的boot order,或者与qemu配合实现直接启动内核。

当选择好启动项后,系统就进入了TSL阶段,在该阶段会执行boot loader,比如grub.efi。UEFI Shell是个临时系统的人机交互界面。正常情况下,系统不会进入UEFI Shell,而是直接执行操作系统加载器,只有在用户干预下或操作系统加载器遇到严重错误时才会进入UEFI Shell。

在RT阶段,随着boot loader的执行,OS最终取得对系统的控制权。

 

 

 

 

参考资料:

1 《UEFI原理与编程(实战)》,戴正华著。 北京,机械工业出版社,2015.1。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值