[轉][整理] SEC->PEI->DXE->BDS

出處:http://william30101.blogspot.tw/

UEFI – SEC Phase

SEC Phase Security

Why??

1. 需要用Assembly 完成C無法處理的工作,像是CPU 的 特殊Register (MSR , MTRR , CPX)
2. C 需要Memory當作Stack處理Local Variable,但是剛Boot的時後,Memory還沒被Initialize 所以無法使用,這時後需要 Cache As Ram。
3. 使CPU進入 Protected Mode (Flat Mode)。

Task

1. 系統Boot / Restart 的Entry point,負責處理所有Platform的Restart Events
2. Create 一個暫時的Region,在Memory Initialize 之前使用
3. 因為Boot的時後,整個code最開始是在 SEC Phase,所以Platform Designer 在Call PEI Foundation前可在SEC Phase Verify PEI Foundation的Security,所以SEC Phase是System Trust root。
4. 傳Handoff message到PEI Foundation(SEC Phase最終目地),這個Message包括:
a. Platform Status
b. BFV (Boot Firmware Volume)的Address 和 Size
c. 暫時RAM的Address 和 Size
d. Stack Address 和 Size
Data Structure 為:EFI_PEI_STARTUP_DESCRIPTOR

typedef struct {

UINTN BootFirmwareVolume;UINTN SizeOfCacheAsRam;EFI_PEI_PPI_DESCRIPTOR *DispatchTable;} EFI_PEI_STARTUP_DESCRIPTOR;

還有另外一個PPI:FORM_INFORMATION_PPI 也可傳送Handoff Message
在SEC_PLATFORM_INFORMATION_PPI.PlatformInformation() Define 一個 EFI_HEALTH_FLAGS,
包含了Processor,Hardware 以及Itanium Process的 PLA(Processor Abstract Layer),code中有關於Process Reset的Status。
下圖為 SEC Phase 執行的Flow

UEFI – PEI Phase

PEI PhasePre-EFI Initialization Environment
Why??
1. 因為所有Code都沒經過Compress,會有Rom size 的問題
2. Memory 還沒Initialize
3. Chipset 還沒Initialize
Task
1. CPU Cache Translation
a. 切換Stack到真正的Cache (Disable Cache As Ram And Enable L1 L2 Cache)
2. Chipset Initialization
a. Platform Chipset Initialization
b. Memory Initialization
3. Board Initialization
a. Clock Initialization
b. GPIO Initialization
4. BIOS Recovery
5. S3 Resume
6. 啟動DEXIPL (DXE Initial Program Loader)
Component
1. PEI Foundation (exist in BFV)
a. Dispatching PEIM
b. Maintaining the boot mode
c. Initialize permanent memory
d. Invoking DXEIPL
2. PEIM Service
PEI foundation建立一個system table叫做PEI service table,是可以被所有的PEIMs所存取的。因為記憶體的空間只有在PEI最後的階段才可以使用
a. PPI Service:管理PPI並在必要時,從temporary ROM裡頭的database呼叫他。
b. Boot Mode Services: 管理系統的boot mode( s3, s5, normal boot, diagnostic, etc.)
c. HOB Service: 創造一個HOB的資料結構,並傳到下一個DXE階段。
d. Firmware Volume Service:走訪FV的FFS(Firmware File System)去找出PEIMs,並找出位在Flash device的Firmware file。
e. PEI memory Service:提供記憶體管理的服務在初始化記憶體以前,或是以後。
f. Status Code Service:提供錯誤回報的服務,例如:port 80h。
g. Reset Service:提供cold or warm系統的重啟動。
h.
3. PEIMS (Exist in FVs)
Executable Binaries – Process , Chipset , Device or other Platform 指定的function
4. PEIM to PEIM interface (PPI) => Data Structer EFI_PEI_PPI_DESCRIPTOR:由GUID和一個Pointer 組成,PEIM 彼此Communicate 的Structure
5. PEI Dispatcher
這是在PEI foundation裡頭的一個state machine,他會衡量每個FV裡頭的PEIMS之間的相依性。決定哪些PEIMS應該要先Dispatch。而他們之間的相依性
是由PPIs所決定,PPIs裡頭敘述了PEIMs之間的相依性。
再一開始的時候PEI dispatcher會去PEI foundation裡頭的PPI Database檢查哪些PPI已經被install如果已經被install,他PEIM的dependency expression會被評估成true,代表所屬的PEIMs已經可以被dispatch。在PEI dispatcher評估過全部FV裡頭所有PEIM的dependency expression發現全部都是FALSE以後,代表已經沒有PEIM可以被dispatch,PEI dispatcher結束,在來PEI foundation把control foward給DXE IPL PPI,進入DXE phase。

UEFI – DXE Phase

DXE PhaseDriver Execution Environment

Why??
System Initialize 的地方大部份都在這。
Task
Component
1. DXE Core (DXE Foundation)
產生一組Boot Services , Runtime Services , DXE Services。由Boot Service code 組合而成。
Boot 到 OS之後就不存在。
2. DXE Dispatcher
Discovery 及以正確的順序Execute DXE Drivers
3. DXE Drivers
Initialize CPU ,chipset 及 System Compoment 以及為了System Services等等做的事
DXE Driver Type

1. Early DXE Driver–Platform initialization Drivers
a. 在DXE Phase 最早執行的Driver
b. 包括Dependency Expression Syntax(DEPEX) 描述Dispatch的順序
c. 包含的型式有
i. Basic Services
ii. Processor Initialization Code
iii. Chipset Initialization Code
iv. Platform Initialization Code
d. 產生Architectural Protocols
2. EFI Drivers that follow EFI Driver Model
a. Initialize 過程不會涉及到Hardware
b. Follow EFI Driver Model
c. 提供對 Console Devices 跟 Boot Devices 的訪問
d. 抽像化 Bus Controller
e. 只有 Boot OS 所需要的Driver 才能被初始化
f. DXE Dispatcher 完成的時後才被呼叫
g. 像Driver的方式一樣被呼叫
h. 需要建立控制台 ( Keyboard , Video) 和處理 EFI Boot Option的時後要連結 EFI Drivers

UEFI – BDS Phase

BDS PhaseBoot Device Select

Why??

BDS通過系統中存在的 Boot Option Variable 來找到並啟動 OS Loader 或 UEFI Application。
Task

1. Initialize console devices base on the ConIn, ConOut and StdErr environment variables.
(初始化根據環境變數Conln 、ConOut 以及 StdErr 的 Console Devices)

2. Attempt to load all drivers listed in the Driver#### and DriverOrder environment variables.
(試著去Load 列在環境變數 Driver####及 DriverOrder上的Driver)

3. Attempt to boot Device from the boot selections list in the Boot#### and BootOrder environment variables.
(試著去Boot在環境變數Boot####以及BootOrder上的 Selections Device)
在這個時後使用者可以看見選單並選擇Boot Device

Console Device
Console Device 是從 Simple Test Output和Simple Input Protocol 抽象出來的。在UEFI中,能夠產生其中一種或兩種Protocol的Device都被當作是 Console Device
Console Device Type
1. VGA Adapters, produce Simple Text Output Protocol.
2. Video Adapters, produce Simple Text Output Protocol.
3.Serial Terminal, produce both Simple Text Output Protocol and Simple Input Protocol.
4.Telnet, produce both Simple Text Output Protocol and Simple Input Protocol.
5. Remote Graphical Displays(HTTP), produce both Simple Text Output Protocol and Simple Input Protocol.
Boot Device的幾種Type:

1.Devices that produce the Block I/O Protocol and are formatted with a FAT file system,  Disk Devices
2.Devices that directly produce the File System Protocol
3.Devices that directly produce the Load File Protocol 

未經允許不得轉載:GoMCU » [轉][整理] SEC->PEI->DXE->BDS