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