PEI and DXE Q&A

开机到os分哪些阶段。
sec->pei->dxe->bds->tsl->rt->al

一. PEI Phase

  1. pei 最主要做哪些事?
    (1)detecting and recovery 坏掉的FV
    (2)初始化系统内存
    (3)把控制权交给dxe

  2. pei 有哪些元件,分别做什么的?
    (1) pei core: 可以视为pei的核心,用来dispatch peim 和提供基本的service.
    (2)pei module: 被pei core所dispatch来做各种任务和初始化。功能有对processor, chipset,device做基本的初始和其他特定的功能。
    (3)ppi: peim和peim之间沟通的介面
    (4)pei dispatcher 为pei core 的一部分,用来搜寻和执行peim.
    (5)pei service: 功能由pei core所提供给peim使用。

  3. pei service 有哪些? 各service 功能 ?
    (1)ppi service
    (2)boot mode service
    (3)hob service
    (4)firmware volume service
    (5)memory service
    (6)status code service

  4. 什么是dependency? dependency关系记录在哪里?如何表示?
    一个peim 在执行时,有可能会用到其他peim的功能。所以要等其他peim先执行后,并install ppi至 ppi database中,
    该peim才能使用,该ppi也才能继续执行下去。dependency 关系放在fv的一个特殊的section中,一个peim有可能会
    需要很多其他peim先执行才能执行,所以表示方法用boolean运算符 and, or, 和sequencing .

  5. 如何dispatch other fv?
    不一定所有的peim都在bfv中,有可能在其他的fv,所以要用dispatch other fv的机制。此时需要一个特别的peim来告诉
    pei core 说其他fv还有peim要dispatch, 所以当pei core dispatch 到这个peim时,会把其他peim的dispatch顺序加到
    pei core 的搜寻algorithm中。

  6. 什么是notification
    假设一个peim有十个function,在执行完九个后,最后一个function 需要其他peim的功能,但该peim尚未被dispatch,
    此时可能用notify的功能告诉pei core,需要ppi才能执行,然后就继续dispatch其他peim,当有ppi被install,就会和notify
    的ppi guid做比较,如果是notify的ppi就跳回到下notify的peim去把剩下的function执行完,提供了一个call back 的机制。

  7. 什么是 PPI?
    peim 和peim 的沟通介面,当peim需要提供功能给其他peim使用时,需要先install 一个PPI至ppi database中,其他的
    peim 就可以通过pei core 来使用该ppi,ppi 的栏们为guid和interface.guid是128位的数据,它是唯一性的,即使不同的
    在同一时间建立也不会相同,Interface是一个function pointer, 用来指向ppi 所提供的function.
    应该说interface 指向一堆数据,可以是一个函数指针,也可以是多个。

///
/// The data structure through which a PEIM describes available services to the PEI Foundation.
/// 
typedef struct {
  ///
  /// This field is a set of flags describing the characteristics of this imported table entry.
  /// All flags are defined as EFI_PEI_PPI_DESCRIPTOR_***, which can also be combined into one.
  ///
  UINTN     Flags;
  ///
  /// The address of the EFI_GUID that names the interface.
  ///
  EFI_GUID  *Guid;
  ///
  /// A pointer to the PPI. It contains the information necessary to install a service.
  ///
  VOID      *Ppi;
  } EFI_PEI_PPI_DESCRIPTOR;

ppi 是长这个样子的

struct _EFI_PEI_S3_RESUME2_PPI {
  ///
  /// Restores the platform to its preboot configuration for an S3 resume and
  /// jumps to the OS waking vector.
  ///
  EFI_PEI_S3_RESUME_PPI_RESTORE_CONFIG2  S3RestoreConfig2;
};
  1. 什么是hob?
    由pei 阶段传送给dxe的信息只能通过hob来传送,所以他包含dxe所需的所有信息,如phit, physical memory,firmware
    volume ,dxe core, dxe stack/bsp, guid hob, 它是linking list的数据结构,标头为phit,其中包含了boot mode的信息,
    尾巴是termination.如果搜寻hob时找到termination表示没有些hob,guid hob 是由chipset vendor 提供的信息,
    有自己的格式,不想被其他人所使用,是属于private information.
    关于hob 的一些具体函数 解析:
    PeiCreateHob 创建hob,并返回hob的地址
    PEI and DXE Q&A_第1张图片
    070-077:PeiCreateHob() 定义, 创建请求类型的HOB数据块,并返回HOB数据块的地址。输入 参数分别是PeiService指针、HOB类型及长度、用于存储创建的HOB地址的指针,返回值是标识是否成功创建的状态值。
    085-088: 获得HOB列表的起始地址。
    090:HOB列表的起始是HandOffHob 数据块,存储当前的系统信息。
    92-94: 调整新创建HOB长度为8字节对齐,并计算当前可用的HOB数据块的空间。
    PEI and DXE Q&A_第2张图片
    103-107: 如果可用的空间不足够创建请求的HOB时,则打印出调试信息说明当前系统资源不足够满足系统运行,并返回系统资源不够的状态值。
    110-113: 当空间足够时,追加新的HOB在当前HOB列表的最末端,并记录HOB数据块的地址。
    121-123:更新可用空间的末端地址,因为新的HOB占用了一部分空间。
    124:返回成功的状态值。

  2. Recovery 的步骤
    (1)由platform policy来决定是否要reset platform.
    (2)不管platform有没有reset,core dispatch都会做reset,然后重新dispatch,只dispatch有标为recovery的peim.
    (3)读取boot mode 来决定要dispatch哪些peim.

二. DXE phase

  1. DXE阶段做哪些事?
    (1)几乎所有的硬件的初始化都在这做完
    (2)产生efi system table, 来提供各种service供所有阶段使用。
    (3)把控制权交给bds来boot os.

  2. DXE 有哪些元件? 各有什么功能?
    (1)DXE Core,可视为dxe的核心,用来dispatch dxe driver 和产生efi system table,以提供boot service, runtime service, dxe service.
    (2) dxe driver, 被dxe core 所读取,用来做各种硬件的初始化,产生protocol和其他service.
    (3) dxe dispatcher: dxe core 的一部分,以正确的顺序来搜寻和执行dxe driver.
    (4) dxe architecture protocol: 由dxe driver所产生,是dxe core和hardware沟通的唯一介面,所以没有install 完全不能开机。
    (5) efi system table: 包含了许多pointer,如所有 efi system table, configuration table, handle database, and console device.

  3. dxe 用什么元件找到FV? 用什么方式将driver 读到memory中?
    用firmware volume block driver, 以memory mapped io的方式,pe/coff loader.

  4. DXE architecture protocol 有哪些? 各有什么功能?
    (1)security: 提供 DXE core 验证 firmware volume中的程序是否可用。
    (2)cpu: 提供cpu的service,如管理cache,管理中断,取得处理器频率,查询处理器的timer.
    (3)typedef struct _EFI_METRONOME_ARCH_PROTOCOL {
    EFI_METRONOME_WAIT_FOR_TICK WaitForTIck;
    UINT32 TickPeriod;
    } EFI_METRONOME_ARCH_PROTOCOL;
    提供一个微小的延时,百万分之一秒为单位。
    (4)Timer: 提供固定时间的中断,使dxe core dispatch 完成所有driver后,会将控制权交给BDS.

你可能感兴趣的:(AIOps,UEFI)