快快樂樂學EFI
Harrison Hsieh 2010/07/19
Chap 1 EFI How to
1.1 概論
有感於當初學習EFI的時候是直接經由BIOS vendor: "I公司"的網路上的訓練課程以及他們派了一組人來幫我們上了一星期Bring up之後,就直接在客戶的案子上邊做邊學,所以很多EFI基本的基礎都沒有學好!因此,最近想化整為零把EFI 重頭學習一遍! 那EFI 入門該學些甚麼呢?! 個人覺得,工欲善其事必先利其器! 所以先去抓一套可以編譯工具以及一套EDK或是 EFI Tool kits 來學習是最簡單的方式! 所以我們的學習目標就是了解甚麼是EFI/UEFI ,然後再告訴你如何去找到你需要的資料以及建構出一個可以撰寫EFI code的環境。
1.2 EFI 歷史回顧
Extensible Firmware Interface (EFI,可擴充韌體介面) 是一個規範,他規範了一個介面,界於作業系統(例如: Windows)與平台韌體(Platform firmware)之間的一個橋樑。 EFI 的改進是被用來取代傳統BIOS的介面(這個傳統的介面被稱之為IBM PC compatible PC 的BIOS或稱之為Legacy BIOS). 最初EFI是由Intel 所主導發展,Intel 已於2005年此規範交給目前UEFI論壇(Unified EFI Forum) 的會員一起共同維護與推廣,這便是眾所皆知的UEFI (Unified EFI,統一的EFI).
最初EFI發展動機是為了在1990年中的Intel-HP Itanium 系統,當時的PC BIOS有一個限制(支援16 bit 的處理器模式,1MB 位址空間與AT 硬體架構),而這個限制使的他無法支援大型伺服器平台的系統Intel-HP Itanium。 最初的時候Intel 只是為了解決這些BIOS啟動時的限制,後來就乾脆改變它的名稱,且稱之為EFI。
Intel Platform Innovation Framework for EFI
Intel 在其平台上為了EFI去建立了一個新框架(Framework),而這個框架的最初代號叫做Tiano,這個框架非常的完整,它包含了EFI對原本傳統韌體的所有支援,他也可以透過所謂的compatibility support module(CSM)來支援傳統的PC BIOS,簡單說就是傳統BIOS能做的EFI也能做,但是不是完整支援就要看CSM支援的程度。
特別是,這個框架包含了在Power- On後,所有必要的初始化步驟去初始化一個平台(Platform);但是這些步驟的運作並沒有被定義在EFI specification內,而是被定義在 Platform Initialization Specification(簡稱PI Spec)內的章節。 Intel 並沒有將這個架構完整的開放給一般的End-User知道,他只有開放這些資訊給一些獨立的BIOS 廠商(稱之為IBV),像是安邁 (American Megatrends ,AMI) 或是系微(Insyde Software)、鳳凰科技(Phoenix) …等的BIOS韌體供應商。
而在TianoCore project(也就是所謂的EFI Developer Kit ,EDK)的Open source之中,會提到如何去開發這個Framework。這個開發工具中含括了EFI的一些硬體初始化的程式碼(只針對一些硬體,但並不包含韌體本身) ,至於這些程式碼的授權包含BSD license 和 Eclipse Public License…等。
而Tiano是為了取代BIOS的一種框架,所以透過EFI可以讓PC的設備自己撰寫一個驅動程式來管理這個設備。而對於開放原始碼來說,這也代表大家可以從TianoCore.org 下載這個專案,然後以BSD(Berkley Software Distribution)的授權方式來生產你的產品。BSD的授權,你自己去修改它的軟體並且發展出屬於你自己的產品,但BSD並不會去要求你把修改的地方公開出來,而這種方法會有助於你去保護你的智慧財產權。
歷史故事簡略介紹完了,廢話不多說我們就馬上進入EFI 世界中,告訴你一個EFI的環境需要哪些工具來編譯、去哪裡下載EFI 工具包、如何建構你的編譯環境。
1.3 Compiler 工具
為了能夠編譯一套EDK或是EFI Tool kits ,你會需要使用到 WinDDK或是VisualStudio,這是為了提供一些Compiler 工具像是C的Compiler : CL.EXE或是像Lib工具: LIB.EXE 以及連結工具Link.exe...etc
另外你可能還需要使用到MASM 來組譯一些少部分的組合語言程式碼,因此軟體需求如下:
(1) WinDDK version 3790.11830(EFI Tool kits預設)/ VisualStudio 2003(EDK預設)/VisualStudio 2005/VisualStudio 2008
(2) EFI Tools Kit /EDK source code.
(2) EFI Tools Kit /EDK source code.
(3) MASM
(4) TortoiseSVN
(4) TortoiseSVN
1.4 EFI Resource
在茫茫網海中,如何蒐尋EFI 相關資源?! 小弟我不是幫Google 打廣告,是因為我常使用他去找資料! 那我們要輸入哪些關鍵字可以找到我們要的資料呢?
首先進入Google搜尋引擎,輸入關鍵字 "EFI EDK",你就會看到下面的連結: http://sourceforge.net/apps/mediawiki/tianocore/index.php?title=EDK
目前EFI 相關資訊比較完整的地方就是這個網站,裡面你可以下載到你需要的EFI Tool kit/EDK ,並且有一些相關的文件可以幫助你開始你的EFI之旅。
1.5 EFI Tool Kits
接下來我們就開始看看這些不同的專案有哪些是可以幫助我們入門,首先要介紹的是 EFI 工具組(EFI Tool Kits),他是一個可以支援快速開發EFI 應用程式的一個環境,讓你可以快速的開發32 bit/64bit 的EFI應用程式。
接下來我們就開始看看這些不同的專案有哪些是可以幫助我們入門,首先要介紹的是 EFI 工具組(EFI Tool Kits),他是一個可以支援快速開發EFI 應用程式的一個環境,讓你可以快速的開發32 bit/64bit 的EFI應用程式。
這些應用程式包含 : EFI based applications, protocols, device drivers, EFI shells 以及不同平台的 OS loaders (IA-32, IA-64(IPF) and Intel 64(EM64T or X64) platforms),你可以透過他的Source Repository下載。
在下載之後,如何得知你下載的EFI Tool kit 版本 : 例如 D:\efitoolkit\doc\RELNOTE.pdf 文件內會有版本,如下圖所示:
1.6 EFI Dev Kit (EDK) : http://sourceforge.net/apps/mediawiki/tianocore/index.php?title=EDK
EDK指的是Open-source的一個EFI “Framwork”元件,英特爾依照EFI規範所實做出來的一套Code,當時的開發的代號為“Tiano”。
EDK的基本上是一個範例元件,裡面有為框架的基礎程式碼(Framework's Foundation code)和驅動程序範例(Sample Driver)。
EDK也是一個開發工具包,可以用來Debugging/Testing EFI 的Framework's driver。
你可以透過下面的連結去取得一些相關的資訊以及說明:
(1) EDK如何開始 : EDK Getting Started Guide 或是 http://ncu.dl.sourceforge.net/project/efidevkit/Edk%20Getting%20Started%20Guide%5B1%5D.0.41.pdf
從下圖中的紅色框框的地方就是SVN下載的連結:
1.7 Download EDK/EFI Tool kits
首先,你必須先安裝 TortoiseSVN,這是一個版本控制的軟體,可以幫助你去Server端把code抓下來! 如果你沒有使用過的人就請先研究看看這個東西要如何使用,這邊就不多說明!
http://tortoisesvn.tigris.org/
http://tortoisesvn.tigris.org/
接著,透過這個TortoiseSVN去抓一套最新版的EDK /EFI Tool kits 下來! 方法很簡單,就是透過TortoiseSVN的Export功能,在他的URL地方輸入你要抓的Code的位置(也就是前面提到的Source Repository),然後輸入好Export directory(例如存放到 D:\EfiToolKit ),然後就等他下載好就可以了,例如下面的圖示與步驟: https://efi-toolkit.svn.sourceforge.net/svnroot/efi-toolkit/trunk/efi-toolkit (下載EFI Tool Kits)
1.8 Reference
UEFI spec : http://www.uefi.org/specs
How to get WinDDK : http://www.microsoft.com/whdc/DevTools/WDK/WDKpkg.mspx
UEFI Programming : http://x86asm.net/articles/uefi-programming-first-steps/index.html
Wiki : http://zh.wikipedia.org/zh-tw/%E7%BB%9F%E4%B8%80%E5%8F%AF%E6%89%A9%E5%B1%95%E5%9B%BA%E4%BB%B6%E6%8E%A5%E5%8F%A3
UEFI Programming : http://x86asm.net/articles/uefi-programming-first-steps/index.html
Wiki : http://zh.wikipedia.org/zh-tw/%E7%BB%9F%E4%B8%80%E5%8F%AF%E6%89%A9%E5%B1%95%E5%9B%BA%E4%BB%B6%E6%8E%A5%E5%8F%A3
3 則留言:
寫的太好了! 按個讚 (y)
怎麼是不是UDK2010的資料?
UEFI 能不能讀取FTP 或是連上Windows 資料夾?
在EDK2下有看到函數,只是沒有sample也不知如何使用...
您有研究過這方面嗎?
張貼留言