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: 常世勳

2009年2月9日 星期一

按Keyboard三個鍵便可讓Windows產生藍屏(BSOD):

1.用Regedit去改登錄檔:
1.1.若是用USB keyboard:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\kbdhid\Parameters
1.2若是用PS2 keyboard:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters

Create一個DWORD鍵,名稱為:CrashOnCtrlScroll, value設為1

2.改完之後記得要重開機.
3.下次開進OS之後,
按下keyboard右側的Ctrl鍵不放,同時再按Scroll Lock鍵二次, 此時系統便會出現
BSOD, message如下:
The end-user manually generated the crashdumpTechnical information:
*** STOP: 0x000000E2 (0x00000000, 0x00000000, 0x00000000, 0x00000000)

這個小技巧對RD debug有個很有用的地方,即是當你遇到系統不知為何變成黑屏時,
若你想知道此時Windows是否還活著,可用這個方法去手動產生藍屏,若windows
還活著,藍屏便有機會產生; 但這有個前提是VGA driver這時是ok的,因為產生黑屏
的原因也有可能是VGA driver本身出問題.

PS:這個方法在Vista, XP皆有效.

Author: 常世勳

2009年1月20日 星期二

UEFI 心得筆記 (2)

1.
PEI phase:
1.1> PEI phase的code是在flash part內執行的.
1.2> 包含S3 resume的code.
PS: S3 resume及normal boot各會有一份memory initial的code,
通常這二份可以是相同的,但也可以針對S3 resume的那一份
memory initial的code做一些精簡.
1.3> 是否要做Crisis的判斷.

2.
SEC and PEI phase的執行時間通常是愈短愈好,以免影響到
S3 resume time. 當然,如果你的客戶不care POST time, S3
resume time的話,則你是可以把一些H/W initial或一些特殊
的function放在SEC phase來做的.

Author: 常世勳

2009年1月15日 星期四

UEFI 心得筆記 (1)

1.開機Post 流程: SEC -> PEI > DXE -> BDS

2. S3 resume: SEC -> PEI (不會run到DXE and BDS phase)

3.BDS其實也是DXE driver的一種

4.UEFI spec的定義, 真正的H/W initial (Ex:PCI BUS, VGA, Keyboard......)是在BDS phase才會執行的.

Author: 常世勳