2009年4月16日 星期四

2009年4月4日 星期六

UEFI Framework的生命週期

簡單的來說,Framework就是UEFI的一種實現,由Intel自己所開發完成的。
它完全實現了EFI spec 中提及的各項功能。開發者可以基於Framework,開發出各種EFI應用。同時也可以為Framework新增新的功能。

Framework的執行(The life cycle of the Framework ),是按照以下的順序來執行的:
(1)SEC :Security
這個是系統上電後所立即進入的一個階段,在這一階段,Intel並沒有做太多的說明,相反,他們說這個階段可以由大家按照自己的需要利用。也就是說,我們可以安排我們自己想要的任何task在這個階段,比如一些身份驗證之類的。

(2)PEI :Pre-EFI
正如它的名字一般,這個是在真正的UEFI環境之前進入的一個狀態,這個狀態相當重要,以至於Intel花了很多時間來向我們闡述。
這個階段會做很多初始化的工作,會初始化CPU,初始化主板上的一些controller以及chipset,更加重要的是,在這個階段內,會使用一種技巧(CAR:Cache as RAM),來迅速的建立起執行C 語言所需的環境,也就是說,會建立一個stack。
這樣,以後機器就可以run那些由C語言所編寫的code了。最後PEI Core會按照一種方法來load所有的PEIM( Pre-EFI Module )。
PEIM是一種可以run在這個階段的一種module,任何人都可以開發自己的PEIM,load的工作由PEIM Dispatcher完成。
全部load之後,PEI會launch DXE Main並將系統控制權交給下一個階段:DXE phase。

(3)DXE :Driver Execution Environment
在這個階段,UEFI真正的提供了一個類似OS一樣的東西。在上一個階段PEI,系統已經建立了C語言可以執行的環境,從這個階段開始,所有的東西,都是用C語言完成了。
進入DXE後,會首先launch各種driver,比如Video Driver,NIC Driver,Soundcards Driver,USB Driver,PCI Controller Driver等等。
完成之後,就開始進行Boot。而這就是下一個階段了。

(4)BDS :Boot Device Select
在這裡,應該會有一個選擇,是進入OS呢?還是去執行那些EFI Applications ?
選擇完成之後,就進入下一個階段了。

(5)TSL :Transient System Load
這個階段會按照在BDS階段選擇的結果來做不同的事情,如果選擇了進入OS,那麼控制權會被傳遞給Final OS Loader。而如果是要去執行EFI Applications,則控制權便交給Transient OS Boot Loader,這樣就會建立起一個執行環境,之後就可以執行那些EFI Applications了。
目前,應該會執行一個叫EFI Shell的程序。而傳統的BIOS Setup也被寫成一個EFI Applications。

(6)RT :Run Time
這個階段就是OS執行的階段。

(7)AL :After Life
這個是OS執行之後的階段,例如關機之類的。但OS crash之後也屬於這個階段,也就是說,在系統萬一crash之後,如果使用UEFI,那麼還是可以做許多事情的。

以上就是Framework完整的執行週期。

Author: 常世勳

EFI Shell (Part 1)

1.什麼是EFI Shell?
EFI Shell是一個UEFI的應用程式,類似於我們在Windows中所用到的cmd或者在Linux中的shell。
EFI Shell是個非常重要的應用程式,它負責接收user的輸入,將user的輸入解譯並告訴kernel去執行,同時將執行結果顯示出來, 以完成和user的互動功能。

2.EFI Shell Commands list:
EFI Shell使用string interface和user互動,以下列出一些較常用到的命令:
( 1)pci : 顯示PCI設備或者PCI的configuration information.
( 2)mm :顯示或者修改memory,I/O以及PCI資源。
( 3)mem :顯示System memory或者Device memory的情況。
( 4)memmap :顯示由EFI Environment建立的Memory Map。
( 5)drivers :按照EFI Driver 的類型來逐一顯示所有已經安裝的Driver。
( 6)devices :顯示所有已經被EFI Driver所控制的device。
( 7)devtree :按照EFI Driver的類型來顯示device tree。
( 8)dh :顯示在EFI Environment中的所有的Handles。
( 9)connect :將一個Driver給 connect到一個device並啟動device。
(10)load :將一個Driver讀入memory。
(11)unload :將一個Driver從memory中unload掉。

Author: 常世勳