小華的部落格: 2012/9/2 - 2012/9/9

搜尋此網誌

星期四, 9月 06, 2012

快快樂樂學EFI(3)-建立EDKII 環境



光陰似箭,歲月如梭! 在EDK推出好幾年後,緊接著BIOS界中的另一個大事情就是又來了一個EDKII。

其實EDK II 推出的概念是因為EDK 有許多使用者有一堆抱怨,像是不能跨平台使用啦~不能用"微軟"之外的Compiler啦~東西不夠模組化啦~

因此針對了使用者的抱怨而做了一些修改? (一些嗎? 改的還蠻大的,不過幾乎都是在Build tool端,本身你寫EFI driver的方式沒啥改變)

從寫EFI driver的角度來看,你會發現有許多的EntryPoint全部被導入到EDKII的Library內去做初始化,這個好處是當Platform改變時容易移植到其他平台!

而其他的部分你就要去習慣新的Build tool的語法以及用法了。

不多說,那要怎麼開始呢? 一樣找Google 大神,找EDKII後點擊第一個連結去抓code吧!


1. 先下載 EDKII codebase

2.解壓縮到隨便一個目錄,我是解壓縮到 E:\UDK2010.SR1.UP1

3.從說明文件 "UDK2010.SR1.UP1-ReleaseNotes-MyWorkSpace.txt" 內你可以得知下面幾件事情

    1) REFERENCE PLATFORMS 有兩種: 
           a.Desktop - [Nt32Pkg]
                             Nt32Pkg\Nt32Pkg.dsc
           b. DUET - UEFI Simulation Environment directly on Hardware (via boot process)

    2) HOW TO BUILD (WINDOWS SYSTEM) 你要如何在windows系統去建構他
        a.Setup Build Environment 設定你的建構環境
         - Install Microsoft Visual Studio 2008* SP1 in the build machine and make sure that AMD64 
                 complier was selected when installing.

                 (安裝微軟的VS2008 SP1,在安裝時要確認你有把AMD64 Compiler選項打勾)

       - Download "iasl-win-20070508.zip" from "http://www.acpica.org/downloads/Version_20070508.php" 
          and extract file "iasl.exe" to C:\ASL
    
           (去這個連結抓iasl-win-20070508.zip 這個檔案,並解壓縮後把iasl.exe複製到C:\ASL ,如果
            C:\ASL目錄不存在請自己建立)

          b . Extract Common Source Code 解壓縮需要的檔案
               -  Extract files in [UDK2010.SR1.UP1.MyWorkSpace]  to the working space directory (e.g C:). 
                  Note the Directory "MyWorkSpace" will be created as a result.
                 
                  In this case, it is C:\MyWorkspace. There are two BaseTools package one is for Windows
                  system and another is for UNIX-Like system. 
                  
                  Please make sure BaseTools(Windows).zip is used here. Expand the appropriate BaseTools to 
                 C:\MyWorkSpace
                 
                 (把UDK2010.SR1.UP1.MyWorkSpace.zip檔案解壓縮後他會產生一個目錄叫做
                    MyWorkSpace,在這目錄內有需要的檔案,你可以把這個目錄複製到
                   C:\MyWorkSpace然後再把Windows的Build tool "BaseTools(Windows).zip"也解壓縮到
                  這個目錄裡面)
                    
               因為我是放在E:\MyWorkSpace,所以會長得像下面這樣子:


             c. Generate OpenSSL* Crypto Library (產生OpenSSL Crypto 函數庫)
                OpenSSL 的 Crypto 函數庫實作了許多資料編碼方法,像是資料摘要函數(使用
                 MD2/MD4/MD5/SHA雜湊演算法),對稱式加密函數(使用RC2/RC4/RC5/DES/IDEA
                 演算法)以及非對稱式加密函數(DSA/RSA 演算法)。                                                                               

                -  Open file "C:\MyWorkspace\CryptoPkg\Library\OpensslLib\Patch-HOWTO.txt" and 
                   follow the instruction to install OpenSSL* for UEFI building.
                    (打開這個目錄下的文件"Patch-HOWTO.txt",然後跟著他的說明去安裝需要的檔案)

                      ◎ Download OpenSSL 0.9.8w from official website:  
                           http://www.openssl.org/source/openssl-0.9.8w.tar.gz (先把這個檔案抓下來) 

                      ◎ Extract TAR into CryptoPkg/Library/OpenSslLib/openssl-0.9.8w 
                          (把解壓縮出來的目錄openssl-0.9.8w 放到CryptoPkg/Library/OpenSslLib底下)

                      ◎ Apply this patch: EDKII_openssl-0.9.8w.patch, and make installation 
                           (套用以及安裝這個修正)
                             ----------------------------- 
                             For Windows Environment:
                             -----------------------------
                            - Make sure the patch utility has been installed in your machine.
                               (確認你有安裝Patch的工具,如果沒有,請先到下面網站下載及安裝)
                                  Install Cygwin or get the patch utility binary from
                                  http://gnuwin32.sourceforge.net/packages/patch.htm

                                 我是下載下面紅色框框的那一個

安裝後會在我的C:\Program Files (x86)\GnuWin32目錄內


               
                            - cd $(WORKSPACE)\CryptoPkg\Library\OpensslLib\openssl-0.9.8w
                            - "C:\Program Files (x86)\GnuWin32\bin\patch" -p0 -i ..\EDKII_openssl-0.9.8w.patch

                 
                            - cd ..
                            - Install.cmd    
                                

              d.  Build Steps (開始Build code吧~)
                 *** NT32 ***
                  - Open a command prompt, type command "cd C:\MyWorkspace" to enter the workspace 
                      directory, and then type command "edksetup" to initialize the working environment.
                  - Type below commands to build platforms  "build -t VS2008x86 
                     (進入到你想到的Platform 目錄內,然後輸入build -t VS2008x86 ,然後你就可以
                      看到開始建構你的Code了,做到這一步就算完成了!)
 
                   
            底下是其他注意事項:
          
            There are two methods to select the tool chain (Use Microsoft Visual Studio 2008* as sample):
            - Update TOOL_CHAIN_TAG in file Conf/target.txt: TOOL_CHAIN_TAG = VS2008
            - Add -t build option in command line: "build -t VS2008 ... "

           For 32-bit VS2008 on 64-bit WINDOWS OS, VS2008x86 should be selected instead of VS2008.
           Please refer to tools_def.txt for all supported tool chains and detailed descriptions.
          (tools_def.txt will be generated at Conf directory after running "edksetup".)
           
        最後,希望大家都能夠成功建立自己的建構環境!

           

星期二, 9月 04, 2012

快快樂樂學EFI (2)


 
快快樂樂學EFI
Harrison Hsieh 2010/07/19
Chap 2 Build EFI How to
      這一章是用來說明如何去Build 你的EFI Tool Kit或是EDK,經由一步一步的帶領之下可以讓你很快的擁有一個EFI 開發環境。
 
2.1 Build EFI Tool Kit
首先,你必須透過SVN去下載一套EFI Tool Kit,假設我下載後是放在 D:\efitoolkit,則他的目錄結構會長的像下圖一樣:
 

 
首先,我們先去修改Build.cmd這個檔案,這個檔案最主要是去控制一些環境變數,這邊環境變數會影響你產生的輸出檔案是 IA32/X64
set SDK_BUILD_ENV=em64t  
set SDK_INSTALL_DIR=
D:\efitoolkit
SDK_BUILD_ENV - 是用來選擇你產生的執行檔是希望在哪個platform中執行,目前一共有幾種Platform可以選擇,像是nt32/sal64/em64t/bios32,而我們選擇的是em64t,他的意思代表我們要產生X64的執行檔
這樣子你才可以放在一個64 bit DXE環境下執行。 如果你想在一個NT32模擬環境或是PEI 32bit環境下執行,那你就要選擇 nt32.
 
SDK_INSTALL_DIR - 指定你的EFI Tool kit擺放的位置,我是放在D:\efitoolkit
 
接下來,你還需要去設定D:\efitoolkit\em64t\sdk.env ,這個檔案是決定你要使用哪一種Compiler 工具,預設是WinDDK,但是小弟總是喜歡來點不一樣的,因此我改使用VS2005!
為了使用VS2005,所以我就必須去修改這個檔案。

 
修改方式很簡單,就是指定到我的VS2005內的Compiler 目錄就可以了:
#MSSdk = C:\WINDDK\3790.1830\bin\win64\x86\amd64
MSSdk = "
C:\Program Files\Microsoft Visual Studio 8\VC\bin\x86_amd64"
然後就是重點了,你必須使用的是Visual Studio 2005 X64 Cross Tools Command Prompt ,而不是一般32 bitCommand Prompt.

接著切換目錄到你的EFI Tool Kit目錄,然後先執行Build.cmd設定環境後,就可以使用nmake 開始編譯你的環境。

 
編譯的結果會產生在 bin output 這兩個目錄內:
D:\efitoolkit\em64t\bin
D:\efitoolkit\em64t\output
 
所以你可以在這些目錄內找到你要的執行檔。
 
[Note]
如果你要build nt32,記得改一下SDK_BUILD_ENV = nt32,並改用Visual Studio 2005 Command Prompt (32bit)
 
2.2 Build EDK
 
EDK 內有許多的Platform 可以使用,其中比較常使用到的就是Nt32Developer's UEFI Emulation (DUET)/X64,下面就介紹這3PlatformBuild的方式:
2.2.1 Nt32 platform
使用VS2005 Build EDKNt32環境時需要注意的地方是把config.env內的USE_VC8 打開,然後再使用VS2005 Command prompt (32 bit)就可以去Build Nt32
(1)SET EDK_SOURCE=D:\EDK
     SET EDK_TOOLS_PATH=%VCINSTALLDIR% <--可有可無
(2)D:\EDK\Sample\Platform\Nt32\Build\Config.env
     USE_VC8 =
 YES
(3) 
然後依照下圖一步一步的做即可 (進入到Build folder,然後鍵入nmake all)

 
(4) Nt32還有個好處就是可以執行NT32模擬器,而執行的方式就是執行 system.cmd 設定 EFI Shell 模擬環境,然後再鍵入 nmake run

然後就會看到下圖:

 
2.2.2 DUET/X64 platform
DUET 這是一個開發者的模擬環境,在你執行nmake all之前,你必須設定下面的環境變數:
        set EDK_SOURCE=d:\edk
        set WIN_DDK_PATH=
可忽略,如果你是VS2003的話就必須設定
        set MASMPATH=c:\MASM615

另外就是要把config.env內的設定打開,這樣子才能使用VS2005
USE_VC8 = YES
USE_VC8_X64 = YES
接著,使用VS2005 Command prompt (32 bit)就可以去Build
 
[Note]
X64 platform build的方式如同DUEF,而且內含有X64 EFI Shell可以讓你在X64 platform使用。
DUET/X64 platform不支援nmake run的模擬環境,所以你沒辦法在你的工作機上運行。
 
 
 
 
  

快快樂樂學EFI (1)


快快樂樂學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 下載這個專案,然後以BSDBerkley Software Distribution)的授權方式來生產你的產品。BSD的授權,你自己去修改它的軟體並且發展出屬於你自己的產品,但BSD並不會去要求你把修改的地方公開出來,而這種方法會有助於你去保護你的智慧財產權。
歷史故事簡略介紹完了,廢話不多說我們就馬上進入EFI 世界中,告訴你一個EFI的環境需要哪些工具來編譯、去哪裡下載EFI 工具包、如何建構你的編譯環境。

1.3 Compiler 工具
   為了能夠編譯一套EDK或是EFI Tool kits ,你會需要使用到 WinDDK或是VisualStudio,這是為了提供一些Compiler 工具像是CCompiler : 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.
(3) MASM
(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 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 文件內會有版本,如下圖所示:

  EDK指的是Open-source的一個EFI “Framwork”元件,英特爾依照EFI規範所實做出來的一套Code,當時的開發的代號為“Tiano”

  EDK的基本上是一個範例元件,裡面有為框架的基礎程式碼(Framework's Foundation code)和驅動程序範例(Sample Driver)

  EDK也是一個開發工具包,可以用來Debugging/Testing EFI Framework's driver
你可以透過下面的連結去取得一些相關的資訊以及說明:
   (2) 一些Framework Spec : http://www.intel.com/technology/framework/spec.htm
從下圖中的紅色框框的地方就是SVN下載的連結

1.7 Download EDK/EFI Tool kits
 首先,你必須先安裝 TortoiseSVN,這是一個版本控制的軟體,可以幫助你去Server端把code抓下來! 如果你沒有使用過的人就請先研究看看這個東西要如何使用,這邊就不多說明!
    
 http://tortoisesvn.tigris.org/

 
接著,透過這個TortoiseSVN去抓一套最新版的EDK /EFI Tool kits 下來 方法很簡單,就是透過TortoiseSVNExport功能,在他的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