UEFI原理与编程实践--UEFI系统的启动过程

看图粗略说一下:

SEC:

安全验证阶段,这个阶段,需要用Assembly做一些 C 无法处理的工作,C语言无法处理CPU的特殊寄存器。让CPU进入Protected Mode(Flat Mode)的环境,会使用到CPU内部的临时ram,其实也就是缓存,这个阶段主要还是使用的汇编,也就是说为后面的阶段建立一个C语言和硬件通信的编译环境,最后将控制权交给PEI Phase。

PEI:

很基本的Chipset 初始化、 Memory Sizing、 BIOS Recovery、 ACPI S3 Resume 、切换Stack to Memory、启动DxeIpl。这个阶段就是开始一些CPU、主板、芯片的初始化了,也就是EFI前期初始化,这个阶段后期才是内存的初始化,知道内存初始化的地方可以便于debug。PEI阶段对系统的初始化主要是PEIM完成的,PEIM之间的通信又是通过PPI完成,进入DXE阶段需要HOB列表。

HOB : Hand off Block

有些 information 要从 PEI Phase 传到 DXE Phase 组成 ,每一个Block有自己的GUID & Structure 。HOB的Block List是动态的,没有顺序要求。

DXE:

遍历固件中的所有的DXE driver,也就是驱动执行环境,当然了,DXE阶段也有DXE派遣器,通信通过protocol,也就是协议。当所有的 dxe driver加载完成后,系统完成初始化,DXE通过EFI_BDS_ARCH_PROTOCOL找到BDS并调用BDS的入口函数,从而进入BDS阶段,从本质上讲,BDS是一种特殊的DXE阶段的应用程序。

BDS:

BDS:Boot Device Selection,启动必要的驱动程序,启动设备选择。BDS策略通过全局NVRAM变量配置,通过修改变量值修改启动顺序(bootorder),这个修改启动顺序在工厂需要经常用到的,工厂都是批量生产,因此需要写个工具给产线TE,批量修改启动顺序。

TSL:

操作系统加载器执行的第一阶段,在这一阶段OS Loader作为一个UEFI应用程序运行,系统资源仍然由UEFI内核控制。

RT:

Run Time,系统控制权从UEFI内核转交到OS Loader手中。

上述是很久之前写的,直接copy了,现在回过头来看,其实这样写是很笼统的,这次,咱们就追踪一下代码,看它到底是怎么跑的吧:

代码追踪

由于目前手上使用的是made in china cpu(ARM)的,所以仅针对这个平台做一下代码追踪,

首先SEC,这里面的汇编代码就不细说了,就说一下SEC跑完了,会进入C,汇编load的就是这个c入口的地址,进入PEI阶段后,这里有个前期和后期的区分,看下代码:

VOID
CEntryPoint (
  IN  UINTN                     MpId,
  IN  EFI_PEI_CORE_ENTRY_POINT  PeiCoreEntryPoint
  )
{
  CHAR8 Char;
  // Data Cache enabled on Primary core when MMU is enabled.
  //ArmDisableDataCache ();
  // Invalidate Data cache
  //ArmInvalidateDataCache ();
  // Invalidate instruction cache
  //ArmInvalidateInstructionCache ();
  // Enable Instruction Caches on all cores.
  Char = 'A';
  SerialPortWrite ((UINT8 *)&Char, 1);
  ArmEnableInstructionCache ();
  Char = 'B';
  SerialPortWrite ((UINT8 *)&Char, 1);

该代码在ArmPlatformPkg/PrePeiCore/PrePeiCore.c,跑啊跑,最后跑到

 // Goto primary Main.
    PrimaryMain (PeiCoreEntryPoint);

// Jump to PEI core entry point
  DEBUG((EFI_D_INFO, "%a() Line=%d \n", __FUNCTION__, __LINE__));
  (PeiCoreEntryPoint)(&SecCoreData, PpiList);

这个PeiCoreEntryPoint不就是_ModuleEntryPoint,PEI image的入口函数,_ModuleEntryPoint最终又调用MdeModulePkg\Core\Pei\PeiMain.c中的函数PeiCore,进入PeiCore后,先根据SEC传入的信息设置PEI CORE services

 //
  // Initialize PEI Core Services
  //
  InitializeMemoryServices   (&PrivateData, SecCoreData, OldCoreData);

然后调用PeiDispatcher执行系统中的PEIM,这个过程需要用到PPI协议,调度系统中的PEIM的过程中就有提供CPU相关功能,例如Cache设置、主频设置,有内存初始化、IO控制器,内存控制器等等,这一部分在PlatformPei.efi中实现,通过拉取PBF中的内容,拉取后再运行MemoryInit.efi,当内存初始化后,系统会重新发生栈切换并第二次进入PeiCore,重新进入后使用的内存就是我们熟悉的内存,然后再运行CpuPei.efi,最终准备HOB列表,利用DXE IPL PPI找到DXE image的入口函数,执行入口函数并将hob列表传递给DXE,这里主要在DxeIpl.efi中运行,运行完了,就进入DxeCore.efi里面并最终通过gBds->Entry (gBds)进入BdsDxe。

之所以写这么多,主要是因为本人想自己重新做一个postcode,写在这里也是笔记,特别是在启动界面挂了,还能发现问题,我觉得这个idea非常不错

UINT32
EFIAPI
PostCode (
  IN UINT32  Value
  )
{
  Value &= 0xFFF;
  //Get the StatusCode set using GetPhaseStatusCode
  Value |= GetPhaseStatusCode();
  IoWrite32 (0x80, Value);
  DEBUG ((DEBUG_INFO, "POSTCODE=<%08x>\n", Value));

  return Value;
}

ok,启动流程就先写到这里。。。。

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: UEFI(Unified Extensible Firmware Interface)是一种固件接口标准,用于用于替换传统的BIOS(Basic Input/Output System)固件,旨在提高系统启动速度、安全性和可靠性。 UEFI原理编程完整版PDF是一份详细的技术指南,提供了UEFI开发所需的全部信息,包括如何设计UEFI驱动程序、应用程序和固件,以及如何使用UEFI的各种功能。 这份PDF文件将UEFI划分为四个主要模块:启动服务、管理服务、硬件抽象层和UEFI Shell。每个模块都有详细的描述和示例代码,此外还包含了UEFI系统架构、数据结构、驱动程序与应用程序的开发方法等内容。 此外,UEFI原理编程完整版PDF还介绍了UEFI与安全性、多核技术、嵌入式系统等方面的关系,并为读者提供了关键的UefiSpec和UefiDebugTools库文档。 总之,UEFI原理编程完整版PDF是一份权威的技术指南,涵盖了UEFI方方面面的内容,非常适合开发人员和工程师学习和参考。 ### 回答2: UEFI(Unified Extensible Firmware Interface)是一种新型的启动编程接口,它替代了旧版的BIOS(基本输入输出系统)。UEFI原理编程可以帮助开发人员理解UEFI的工作原理编程技巧。 UEFI拥有完善的安全性和可靠性,其编程方式也十分灵活。与BIOS相比,UEFI可以支持更多的硬件平台和更大的硬盘容量,同时也可以优化启动速度和程序的执行效率。 UEFI原理编程pdf完整版可以帮助开发人员更好地了解UEFI的概念和架构,并提供丰富的代码示例,帮助开发人员快速掌握UEFI编程技能。除此之外,该书还介绍了UEFI启动流程、安全策略、UEFI应用的开发和调试等内容,对于想要深入学习UEFI编程的开发人员来说是一本很有价值的参考书。 总之,UEFI原理编程pdf完整版是一本优秀的技术参考书,其内容涵盖了UEFI的方方面面,对于想要深入了解和运用UEFI的开发人员来说具有很高的参考价值。 ### 回答3: UEFI(Unified Extensible Firmware Interface)是一种新型的系统固件接口,它为操作系统与硬件之间提供了一种标准的接口。相比传统的BIOS,UEFI可以支持更多的硬件功能,同时也更加安全和灵活。 UEFI原理主要包括以下几个方面:1、UEFI接口包括了启动管理器,硬件抽象层,运行环境和应用层等模块;2、UEFI支持模块化设计和驱动加载,可以动态地加载和卸载硬件驱动,提高了系统灵活性和安全性;3、UEFI使用GUID Partition Table(GPT)替代MBR分区表,支持更大的硬盘容量和更稳定的系统启动;4、UEFI还支持Secure Boot功能,可以防止恶意程序篡改启动软件和系统文件,提高了系统安全性。 关于UEFI编程,需要掌握以下几个核心内容:1、UEFI开发环境的搭建,需要熟悉UEFI规范以及系统固件接口的程序编写;2、UEFI应用程序的设计和开发,可以利用UEFI提供的应用程序接口(API)或者开发自定义的应用程序;3、UEFI驱动程序的编写,需要掌握UEFI驱动程序的架构和编程模型;4、UEFI启动管理器的开发,需要熟悉UEFI启动管理器的设计和实现。 总之,UEFI是一种新型的系统固件接口,可以为操作系统和硬件提供一个标准的接口,提高系统的安全性和灵活性。对于UEFI编程的学习和掌握,则需要对UEFI规范和程序设计有深入的了解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值