2018年11月2日 星期五

UEFI BIOS 架構 (2) PEI

PEI(Pre EFI Initialization)是BIOS開機的第二階段, 這個階段主要做的是正常記憶體的初始化, 它會把之前存在CACHE記憶體裡的資料搬到正常記憶體, 首先我們必須有Dispatcher(在PEI CORE裡面)和PEIM(PEI Module)觀念, 見下圖:


由此圖所見, Dispatcher的角色是一個類似調度器的工作, 它依照dependency決定次序看要先執行哪個PEIM(dependency以後會有專文介紹), 當執行PEIM的時候BIOS程式的控制權就轉到PEIM(如直線所示), 而PEIM執行完就把控制權轉回Dispatcher(如弧線所示)繼續執行下一個PEIM, PEI階段兩個PEIM互相溝通是用PPI的方式, 以後也會有撰寫PPI的實例, 另外PEIM還有一種叫Notification的機制, 它配合PPI來使用, 舉例當我執行第6個PEIM時有一些code我不希望這麼早被執行, 於是我就把這些code宣告成Notification並用一個PPI做記號, 當第14個PEIM安裝了這個用來當作記號的PPI時, 則程式流程就會轉到第6個PEIM所宣告的Notification code, 執行完再轉回第14個PEIM, 其實PEI階段最重要的記憶體切換(Cache切到正常記憶體)也會安裝一個PPI, 如前所述這個PPI會搭配相當多的Notification, 畢竟真的有許多元件初始化的code必須在記憶體切換之後才能正常動作

PEI的介紹沒這麼簡單就結束, 首先PEI會建立許多HOB(Hand-off block), 這些HOB被用來把資訊跨階段從PEI傳到DXE, 而DXE就是BIOS開機第三階段, 再來PEI跟Recovery有關, Recovery會在電腦BIOS損壞(我猜測可能是使用者亂改設定), 或是硬體的jump被設定時啟動, 進入Recovery Mode就是為了恢復原本BIOS的正確性, 所以Dispatcher會先把之前跑PEIM的紀錄都消除, 然後只跑專門為Recovery而存在的PEIM, 最後PEI還跟S3有關, S3就是電腦的睡眠模式, 為了維持原本電腦的狀態所以電腦在睡眠時記憶體不會斷電(記憶體維持睡眠前的值), 當從睡眠階段喚醒時開機流程不會進到DXE(因為DXE需要大量記憶體空間存放Driver), 開機流程直接從PEI跳進OS, 補充一點PEI Dispatcher最後一個執行的PEIM必定是 DXE IPL(Initial Program Loader), 這個叫IPL的PEIM負責將開機流程進行到第三階段(DXE)

沒有留言:

張貼留言