PEI-------Pre-EFI Initialization (预先EFI初始化)详解

PEI是在SEC阶段之后的下一个阶段。它实现了初始化内存(UEFI第二阶段)。

虽然SEC阶段对CPU和CPU内的资源进行了初始化,但是PEI阶段可用的资源依旧十分有限,该阶段对内存进行初始化,主要功能是为DXE阶段准备执行环境,将所需要传递给DXE的信息组成HOB(Hand Off Block)列表,最终将控制权转交到DXE。

整体流程     

  1. PEI Image的入口函数位_ModuleEntryPoit,该函数最终调用PEI模块的入口函数PeiCore。
    VOID
    EFIAPI
    PeiCore (
      IN CONST EFI_SEC_PEI_HAND_OFF        *SecCoreDataPtr,
      IN CONST EFI_PEI_PPI_DESCRIPTOR      *PpiList,
      IN VOID                              *Data
      )
  2. 进入PeiCore后,先根据SEC阶段传入的信息初始化PS(PEI Core Service)。
    //
      // Initialize PEI Core Services
      //
      InitializeMemoryServices   (&PrivateData, SecCoreData, OldCoreData);
  3. 信息设置完成后,调用PeiDispatcher执行PEIM,准备HOB列表。
    //
      // Call PEIM dispatcher
      //
      PeiDispatcher (SecCoreData, &PrivateData);
  4. 内存初始化。
  5. 内存初始化后,系统会发生栈切换并重新进入PeiCore,重新进入到PeiCore后使用的内存是我们熟悉的内存。
  6. 待所有PEIM执行完后,调用PeiServices的LocatePpi服务得到DXE IPL PPI的Entry服务,这个Entry服务实际上是DxeLoadCore,它找出DXE Image的入口函数,执行DXE Image的入口函数并将HOB列表传递给DXE。
     // DXE IPL
      Status = TempPtr.DxeIpl->Entry (
                                 TempPtr.DxeIpl,
                                 &PrivateData.Ps,
                                 PrivateData.HobList
                                 );

        可见下图,理解整个PEI流程:

涉及单元及功能

  1. PEI内核(PEI Foundation):负责PEI基础服务和流程。
  2. PEIM(PEI Module):

        ① 可执行的二进制代码模块,封装着一些关于Processor、Chipset、device或者是平 台相关的一些功能。

        ② 每个PEIM都是一个独立的模块。通过PEIServices,PEIM可以调用PEI阶段(UEFI)提供的系统服务。通过调用这些服务,PEIM可以访问PEI内核。PEIM之间的的通信通过PPI(PEIM-to-PEIM Interfaces)完成。

        ③ PEI阶段对系统的初始化主要由PEIM完成。

     3.PEI Dispatcher派遣器 :

        ① 找出系统中的所有PEIM,并根据PEIM之间的依赖关系按顺序执行PEIM。

具体调用的系统PEIM(PEI Module)

  1. CPU PEIM(提供CPU相关功能,如进行Cache设置、主频设置等)。
  2. 平台相关PEIM(初始化内存控制器、I/O控制器等)。
  3. 内存初始化PEIM(对内存进行初始化,此时内存才可用,之前使用的CPU模拟的临时内存)。
  4. 调用PEIServices得到DEX IPL PPI的Entry服务(即DEXLoadCore)。

注:PPI与DEX阶段的Protocol类似,每个PPI都是一个结构体,包含有函数指针和变量。每个PPI都有一个GUID。通过PEIServices的LocatePPI服务可以找到GUID对应的PPI实例。

PEI阶段的功能

初始化内存。为DXE阶段准备执行环境。

简单而言分为以下几点:

  1. 基本的Chipset初始化
  2. Memory Sizing
  3. BIOS Recovery
  4. S3 Resume
  5. 切换Stack到Memory (Disable CAR, Enable Cache)
  6. 启动DXEIPL(DXE Initial Program Loader)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值