UEFI Boot Flow 系列之SEC

轉自CeliaQianhj
 
爲什麼要有SEC Phase?

1. 需要用彙編語言來完成C無法處理的工作,如C語言無法處理CPU的特殊寄存器(MSR,MTRR,CRX)。

2. C語言需要Memory當成Stack來處理Local 變數,而剛開機Memory還沒有被初始化,還不可用,所以需要CAR(Cache As Ram)的初始化。

3. 讓CPU進入Protected Mode(Flat Mode)。

SEC Phase的任務

SEC Phase是整個UEFI Boot過程中的第一個階段,它主要完成的任務有:

1.  系統上電/重啓的入口,處理所有的平臺restart events,包括開機,重啓,或是各種異常條件下的啓動。

2. 創建一塊臨時的內存區域,在系統內存初始化之前使用,比如用CAR(Cache As Ram)或SRAM。

3. 在安全方面,是信任鏈的根(the root of trust)。之後模塊的任何安全相關的設計都必須有個根,而因爲系統開機之後最初的代碼實現是在SEC階段,所以平臺設計者在調用PEI Foundation之前可以在SEC階段驗證PEI Foundation的安全性。所以說SEC階段是系統信任鏈的根。

4. 傳送Handoff信息到PEI Foundation(這纔是SEC Phase的最終目的),這些信息包括:

1>.平臺的狀態,

2>.BFV(Boot Firmware Volume)的位置和大小,

3>.臨時RAM的位置和大小,

4>. 棧的位置和大小。

數據結構爲:EFI_PEI_STARTUP_DESCRIPTOR。

typedef struct {
  UINTN                   BootFirmwareVolume;
  UINTN                   SizeOfCacheAsRam;
  EFI_PEI_PPI_DESCRIPTOR  *DispatchTable;
} EFI_PEI_STARTUP_DESCRIPTOR;

另外,還有一個PPI:EFI_SEC_PLATFORM_INFORMATION_PPI 可以用來傳送Handoff信息。在SEC_PLATFORM_INFORMATION_PPI.PlatformInformation()中定義了一個EFI_HEALTH_FLAGS,它包含了Processor,hardware,and/or安騰處理器中PLA(Processor Abstract Layer)代碼中關於處理器Reset上的狀態信息。

SEC階段代碼流程圖:

PEI Core Entry Point 是如何確定的?

是由Build Tool來確定的。在Build出來的bin file位置0xFFFFFFE0存放。

BFV Base Address是如何確定的?

是由Build Tool來確定的。在Build出來的bin file位置0xFFFFFFFC存放。

 

 

 

Refer to:

Pre-EFI Initialization Core Interface Version 1.2

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