Linux Bootstrap With UEFI


UEFI系统

UEFI(Unified Extensible Firmware Interface)通过boot service控制系统的启动过程,就像古老的BIOS一样,同时UEFI通过runtime service为操作系统和系统固件提供接口,与BIOS不同的是UEFI独立于CPU有自己的架构,同时它拥有自己的驱动。UEFI无法挂在分区并读取某些文件系统。

x86架构的计算机以UEFI模式启动的时候,UEFI的接口在系统的存储空间搜索分区标签,这些标签有一个全局唯一标识符(globally unique identifier, GUID),计算机中的这一区域被称为EFI系统分区(EFI System Partition, ESP)。该分区包含了一些编译好的应用,这些应用满足EFI架构,这些应用包含操作系统的bootloader,启动相关的工具。UEFI系统包含了EFI启动管理器,该管理器能够按照默认配置启动系统,或者提示使用者选择需要的系统来进行启动。但一个bootloader被选中之后,UEFI将其读取到内存中,然后将启动控制权交给bootloader。

UEFI启动过程

UEFI从存储中(硬盘)读取分区表,并且挂在ESP,ESP是一个拥有GUID的VFAT格式的分区表。以CentOS7.3为例,它的ESP包含了grub2.efi, shim.efi, MokManager.efi等应用,ESP挂载目录为/boot/efi/,CentOS的ESP应用保存在/boot/efi/EFI/centos中。UEFI启动过程大致分为6个阶段,如下图所示的UEFI启动过程。

uefi-pic1
UEFI Boot Process

SEC阶段

SEC阶段(Security (SEC) phase) ,当系统开始启动的时候,CPU缓存被激活后处理器开始执行计算机系统的复位并直接由Flash启用启动程序。因为处理器处于实模式(Real Mode),它可以执行汇编语言程序的固件。电源状态将决定是使用Hard Boot ,还是使用Soft Boot 。Hard Boot时CPU缓存从Flash的代码完成初始化,同时激活基于C代码的堆栈内存模型。处理器从16bit的Real Mode切换到64bit的Protected Mode,同时将控制权交给PEI阶段。该阶段所谓的安全其实是用词不当,因为该阶段没有代码执行安全认证,它仅仅还是假设恶意程序无法以Flash为目标,因为Flash仅在签名认证通过的情况下才能更新。

PEI阶段

PEI阶段(Pre-EFI Initialisation phase) ,PEI阶段的任务是在CPU缓存中扮演堆栈程序的角色。在Hard Boot中,PEI通过预置在Flash ROM中的UEFI程序初始化RAM,但是RAM的初始化在Soft Boot中不会发生,因为在Sleep State中OS环境被保存在内存中。PEI同时加载一些模块来确保平台由充分的资源来保证DXE阶段可以执行高级的UEFI程序。

DXE阶段

DXE阶段(Driver Execution Environment phase),该阶段被设计为独立于平台的加载设备驱动到内存中并执行。安全启动被强制设计为一个UEFI的开放接口,该接口被用于从BIOS ROM以外的地方加载它们的驱动程序。大多数的UEFI系统在DXE阶段完成初始化。

BDS阶段

BDS阶段(Boot Device Selection phase),BDS阶段将解析启动配置数据从而决定启动策略。它与DXE一起决定设备驱动是否需要签名人认证。Legacy BIOS Boot或者UEFI Boot从EFI分区加载的Bootloader程序会相应的将MBR启动代码加载到内存中。同时,BDS也允许用户进入Setup选择EFI Shell或者UEFI应用作为启动设备。

TSL阶段

TSL阶段(Transient System Load phase),根据BDS阶段选择的启动设备,固件启动一个OS loader或者EFI Shell或者UEFI应用。

RT阶段

RT阶段(Run Time phase),RT阶段UEFI程序将会从内存中清除同时释放给OS。Run time service占据一小部分内存,该服务是UEFI BIOS更新的时候被调用。

UEFI BIOS和FI Shell采用开源证书,该证书允许之心第三方的UEFI程序。因为UEFI程序仅仅是UEFI固件,本质上来讲UEFI BIOS能够支持其他的UEFI固件。这就帮助设备和OS厂商提供它们自己的UEFI固件作为UEFI BIOS的扩展。

安全启动

安全启动是UEFI标准中提供的一个功能,具体情况可以参考UEFI标准。利益相关该部分的研究成果是我在任职的公司完成,成果属于公司所有不方便在此处公布。后面有机会会重新整理之后再发表出来。有兴趣的话可以参考链接Redhat相关的文档

Reference

  1. https://answers.microsoft.com/en-us/windows/forum/windows8_1-security/uefi-secure-boot-in-windows-81/65d74e19-9572-4a91-85aa-57fa783f0759
  2. https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sec-UEFI_Secure_Boot.html
  3. https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sec-UEFI_Secure_Boot.html
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s