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的地址
    在這裏插入圖片描述
    070-077:PeiCreateHob() 定義, 創建請求類型的HOB數據塊,並返回HOB數據塊的地址。輸入 參數分別是PeiService指針、HOB類型及長度、用於存儲創建的HOB地址的指針,返回值是標識是否成功創建的狀態值。
    085-088: 獲得HOB列表的起始地址。
    090:HOB列表的起始是HandOffHob 數據塊,存儲當前的系統信息。
    92-94: 調整新創建HOB長度爲8字節對齊,並計算當前可用的HOB數據塊的空間。
    在這裏插入圖片描述
    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)幾乎所有的硬件的初始化都在這做完(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.(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中的程序是否可用。(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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章