研究起点是CPU收到ResetVector信号后,开始执行第一行代码,一直到计算机关机/重启/崩溃,被划分为七个不同阶段。
1. SEC安全阶段
最早开始运行的固件代码,很大部分是汇编语言开发的。
主要负责四件事:
- 处理平台所有的重启事件
给CPU发送ResetVector信号,也就是重置,与关机再开机不同。 - 创建一个临时内存区
初始化了CPU,没有初始化内存,但又有需求。SEC阶段的C代码需要堆栈,这就要求必须有内存,在物理内存没有初始化的情况下会临时使用缓存。内建在CPU中初始化好的,可以暂时为C代码服务。 - 作为整个安全执行的根、
SEC是整个系统执行的起点,可能会遇到各种异常,就需要设置IDT,有了中断描述符表接受异常,就能让系统遭遇意外情况时不至于崩溃 - 为下一阶段PEI传递交换信息
为PEI阶段的代码设置临时内存的基地址和长度,并传给PEI。还要找到PEI代码的入口点,将控制权移交过去,并且处理临时内存
2. PEI阶段
早期的EFI初始化,处于启动流程很早期的阶段,只能利用处理器的片上资源。
- 初始化永久内存
调用SEC提供的接口处理作为临时内存的缓存保障安全 - Hand-Off-Blocks
把初始化好的永久内存通过hand-off blocks形式进行描述。HOB是一种用于交换的块,负责阶段间的数据传递。PEI会收集很多下一阶段DXE所需的数据,这些数据就打包为HOB,然后用一个头来对内存中的HOB进行标识,头和HOB组成HOB List。 - 固件卷所处的位置也会被PEI使用HOB描述。
- 控制权交给DXE
PEI代码分为两部分:PEI Foundation和PEIMs,就是基础和模块。Foundation负责接受SEC发送的交换数据,并扮演模块分发的角色。PEIMs是模块化的PEI功能有其实现。
3.驱动执行环境
有DXE基础、DXE分发器以及一系列驱动。这一阶段主要是把硬件的基本驱动程序加载起来,建立两者间的联系,为更上层的接口提供基础支持,比如显卡驱动就支撑了Print()函数。
4.BDS启动设备选择
开机时的启动菜单就是这一阶段负责生成的,所有的设备都会列出来,搜索原理是寻找具有FAT32分区的设备,这些会生成UEFI认可的菜单项,老一些的电脑还支持MBR分区的硬盘,还有网络适配器,UEFI固件也可以支持从网络远程系统镜像启动。
5.TSL预系统加载阶段
它是OS Loader的主战场,TSL就是正式操作系统加载前的预备阶段,需要Loader找到并加载OS。
6.RT(Runtime)
运行时。
7.AL
最终阶段,由常驻的UEFI驱动组成。计算机关机、休眠、睡眠、重启过程的系统信息都会在这一阶段保存。
仅为笔记学习使用
参考:https://www.zhihu.com/people/tanyugang.com/zvideos?page=2