小華的部落格

搜尋此網誌

網頁

星期五, 9月 13, 2013

簡略介紹 EDKI與EDKII (EDK2) 的差別

這篇文章主要是簡單闡述一下EDKI 與 EDKII 在BIOS工程師眼中的差別在哪裡? !
在討論之前,我們先簡單說一下Package是甚麼東西?

Package是甚麼?
 
     在EDKI裡面,我們在寫UEFI driver的時候並不會有所謂的 "Module" 的概念在裡面。我們開發的時候都是以 driver為單位,並不會考慮一些模組化的問題。
 
[註] UEFI 的可執行檔案我們的術語是Image或是Driver,所以當你聽到這個術語時把他當成類似EXE執行檔就可以了。
 
    而 EDKII裡面,他加上了 Package這個概念(模組化)。其實可以把它看成是一個目錄,而這個目錄名稱會是"xxxPkg",而目錄裡面就是一堆相關的UEFI driver。
 
所謂的相關的UEFI Driver是說,假如你看到目錄名稱是"NetworkPkg",那麼這個Package裡面的東西就跟Network有關,所以在這個目錄內可以有其他子目錄去存放著 PEI/DXE/SMM/APP  Driver或是 Library
 
而組成一個 Package的元素(一個PKG目錄內)必定包含一個 *.dec  *.dsc
 
Package的好處是甚麼? 就是"獨立"
 
在EDKI 的時候,你想單獨產生一個特定的CODE時,你至少"整套CODE"要先產生一次! 而EDKII使用這種"獨立"的概念就不需要整套CODE build完才產生你要的CODE!
 
但也是因為獨立,所以有很多地方都是為了解決獨立出來問題而去改了一堆Build tool動作跟你描述.dsc還有.FDF的動作。
 

EDKI與EDKII主要的差別?

- Build process的改變
EDKI : ProcessDsc.exe執行將 *.inf 轉換成 makefile 的動作
EDKII: Build.py  去處理,同時還會產生  AutoGen.c & AutoGen.h (Parsing *.dec )

- DSC file / FDF file
EDKI裡,決定一個 driver要放在那一個 firmware volume裡是在"1個.dsc"就可以決定的,通常都會是叫做PlatformDsc.dsc或是 Build.dsc這個檔案!
 
在檔案內你會透過FV=FVREVOVERY的方式把底下的UEFI Driver通通放進去FVREVOVERY.FV,接著透過Flashmap.fdf去規劃ROM的區域,然後決定 FVMAIN.FV放進去哪個區域。
 
但是 EDKII為了實現 Package這個概念,所以.dsc不再用來描述UEFI driver要放到哪個FV,而只是拿來決定要不要BUILD這目錄下的UEFI driver而已!
描述那些UEFI DRIVER放到ROM的哪個位置的動作就變成EDKII新的FDF SPEC所描述的那些動作,所以你必須要新的FDF 格式中描述你那些UEFI driver是要放進去ROM裡面的。
 
- PCD/DEC
因為EDKII還希望做到不用改到Source code就能夠改變CODE的行為,所以延伸出了PCD這種控制方式,不過我是覺得它需要額外寫TOOL去達到他的理念而增加了許多BIOS工程師的麻煩。
 
  PCD我自己是分成兩部分學習,一部分是屬於如何在RUNTIME管理PCD Database的部分,另一部分就是如何透過DEC FILE去產生PCD的預設值以及有哪些PCD LIB與Header file可以存取他,因為這部分牽扯到實作面(靠的是C語言巨集),所以需要邊開著CODE邊解釋,所以很難使用文章解釋,希望大家有機會在業界遇到我時在幫大家解釋吧^^.
 
  你暫時可以簡單把他想像成是一個變數宣告的方式,變數會有生命週期(整個RUNTIME或是某一個DRIVER而已)與屬性(唯讀/可讀寫),可以方便你在CODE裡面存取他!
 
  以上的部分大致上就是EDKI 與EDKII的差別,對於BIOS工程師來說可能會需要去習慣新的DSC/INF/DEC/FDF寫法,以及BUILD.py這個工具的用法,其他的就是要去習慣各家IBV對於PCD的作法!
 
EDKI與EDKII Reference Code的差別?
 
EDKI 與 EDKII Reference code的部分,以目前我接觸到的部分來說最大的差別在於"移植的觀念"。
 
EDKI 身不好移植到不同平台,所以EDKII在這部分是希望能夠好移植,而他的使用的方式是約束大家使用同一個EntryPoint,也就是說在EDKII RC code部分,如果大家的EntryPoint都能指向同一個地方做完一些跟Platform相關的事情之後再跳回去Driver EntryPont,那麼下次如果要移植到不同平台時,我只要把這個共通的EntryPoint改寫就好了。
 
所以在 RC CODE部分,你會看到他先透過共同的_ModuleEntryPoint,然後再從C_FLAG設定的給EDKII Gule Library的EntryPoint 跳回去你設定的Driver EntryPoint,這就是他主要的改變!
 
因為EDKII Glue Library做掉一些事情了,所以以前在UEFI Driver內可能一開始會去呼叫InitDxeLib()來初始化gBS/gRT/gST的動作就不用做了,另外Smm Driver寫法也略有不同,其實都是因為被偷做,所以你可以少做!
 
EDKI與EDKII Code Size的差別?
由於EDKI 本身在LIBRARY撰寫部分並沒有明確規範,所以連結出來的可執行檔的CODE SIZE會比較大,在EDKII上也針對了這部分重新改寫了原來的LIBRARY以減少連結時的CODE SIZE,因此理論上EDKII 環境下產生出來的可執行檔SIZE應該要寫一些。
 
希望簡略的解釋能更幫助大家在學習EDKII 甚至轉換到EDKII的時候不會驚慌失措,也比較知道為什麼要改成這樣子。




星期四, 9月 12, 2013

DosBox 模擬器 : 如何自己Compiler


        如果各位是BIOS工程師,但有時候可能有需要在 64 bit OS底下去執行Debug32.exe來看看一些組合語言的東西,但是卻發現在64 bit OS底下,Debug32.exe這隻程式是不能被執行的!

為了解決這個問題,我們通常都會去抓DosBox模擬器來使用,而這邊不是教大家去哪抓,而是跟大家說怎麼去自己抓回來Doxbox source code回來,然後使用VisualStudio 2010 自己Compiler 這個好用的工具。

首先,我們需要去抓Doxbox source code跟一些Library,而 DosBox source code 可以透過SVN抓,但是因為這個DosBox在編譯的過程中會去連結一些Library,所以就先就列出來那些會在設定環境時使用到的部分,要大家要自己先去下載:

Dosbox SVN: http://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk (我是抓Revision 3833)
 
SDL2.0:  http://www.libsdl.org/download-2.0.php  (執行DosBox.exe 需要他的SDL2.DLL)
Libpng(libpng.lib): http://www.libpng.org/pub/png/libpng.html     (我是抓1.6.3)
Zlib(zlib.lib) : http://www.zlib.net/  (我是抓Zlib 1.2.8)
WinCurses(Curses.lib): http://www.baldwin.cx/~john/projects/WinCurses.html (Debug用)

 底下是我抓下來後解壓縮放到E:\DosBox的情況:


設定DosBox Compiler環境

1.我們要先產生zlib.lib給LibPng.lib使用,所以透過VS2010 compiler的方式就是先開啟VS2010 commnd prompt,然後鍵入:
 
   E:\DosBox\zlib-1.2.8:\>  Nmake /f win32\makefile.msc
 
在編譯結束後,你會看到zlib.lib被會放在Zlib-1.2.8目錄內。


2.由於DosBox還需要連結libpng.lib,所以我們透過VS2010方案去產生libpng.lib。
   所以在開啟VS2010方案檔案前,要先把預設的ZLIB路徑指向我們前面抓的那一個zlib-1.2.8,所以先去修改zlib.props這個檔案,如下圖:
 
接著開啟方案,然後整個Rebuild Solution.
 
3.當我們需要的LIB都準備好之後,就可以開啟DOSBOX方案
 
   E:\DosBox\visualc_net\dosbox.sln
 
4. 因為我們抓的LIB版本比原本設定的還新,所以要去設定方案內的專案屬性內的C++跟Linker的設定:
 
    a. Project Properties->C++->General->Additional Include Directories -->Edit
        ../include
        ../src/platform/visualc  
        ../SDL-1.2.15/include
        ../SDL2_net-2.0.0/include
        ../lpng163
         ../zlib-1.2.8
 
   b. Project Properties->Linker->Input->Additional Dependencies-->Edit
       opengl32.lib
       winmm.lib
       ../zlib-1.2.8/zlib.lib
       ../lpng163/projects/vstudio/Debug/libpng16.lib
       ../SDL2_net-2.0.0/lib/x86/SDL2_net.lib
       ../SDL-1.2.15/lib/x86/sdl.lib
       ../SDL-1.2.15/lib/x86/sdlmain.lib
       ../curses/curses.lib
       odbc32.lib
       odbccp32.lib
       ws2_32.lib
 
5. 如果環境都設定好了,你就可以開始Rebuild,接著等一下子後你就可以看到產生DosBox.exe 到你的Release 目錄內了.
 
6. 由於產生出來的DosBox.exe 並不能單獨直接執行,還需要一些DLL跟這個執行檔放在同一個目錄內,這些DLL檔案可以從前面抓的那些LIB目錄內找的到,所以我把它集中在同一個目錄內,如下圖所示:


7. 接著你只要執行dosbox.exe (滑鼠點兩下執行)就可以看到模擬器的畫面跑出來,然後我把我自己的E Driver掛在模擬器的K drive,之後就可以在模擬器內的K:\底下找到我放在E:\Debug32.exe並且執行成功:
 
 
我的DosBox Compiler環境是在 Window8 64 bit OS,然後使用 Visual Studio 2010的 32bit compiler,所以可以看到我是選Win32 Release build,設定的目錄都是指向x86而不是x64。

 
希望這邊文章對於想要自己Compiler DosBox但是又一直不成功的人有幫助 ^^
 
 
 
 
 
 


星期三, 9月 11, 2013

一個關於INT 3h的知識分享

恩,好久沒來發文章了!  慢慢地最近比較有時間,所以會在寫些文章分享一下知識!

-----------------------------------------------------------------------------------------------------------------

一個關於INT 3h的知識分享

一般來說INT xxh的機器碼會看到是CD imm8 ,例如: CD 19 就是呼叫INT 19h.

而INT3比較特別,他有一個1 byte的OPCODE是0xCC,使用1個BYTE的好處是"他可以覆蓋在任何指令的第一個BYTE而不會去破壞掉原本的指令意思"

而2 bytes的方式就沒這個好處! 如果你了解INTEL 指令,你就會知道一行指令是由Prefix OPCODE.......部分組成的,所以一行指令所代表的機器碼長度不同,因此一個Byte的INT 3h就可以利用這些特性讓Debugger去插入INT 3h的斷點,然後跳到Debug Engine裡面.


底下是範例代碼,一個換掉原本位置的方式:

    lds      bx,BreakToAddress  ;Insert INT3h OPCODE to this addrees
    mov    al,0CCh                  ;INT 03h opcode 
    xchg   [bx],al                    ;Set INT 3h OPCODE and also save original opcode into AL          

    mov    OriginalOpCode,al   ;Save  original opcode 
  

星期三, 9月 19, 2012

EDKII - Build.py

最近在研究EDKII的 Build process的動作,順便做做筆記!

這個Python Build tool是EDKII/EDK2 的一個Build tool,而底下是Build.py 目前支援的Command line options,因為我還沒追完全部的動作,所以先整理一下比較會使用到的部分:

===============================================================
"-a", "--arch", , choices=['IA32','X64','IPF','EBC','ARM'], dest="TargetArch",
"-p", "--platform"dest="PlatformFile"
"-m", "--module",, dest="ModuleFile"
"-b", "--buildtarget",  dest="BuildTarget"
"-t", "--tagname", , dest="ToolChain",
"-x", "--sku-id", , dest="SkuId", 
"-n",  dest="ThreadNumber"
"-f", "--fdf", dest="FdfFile"
"-r", "--rom-image", dest="RomImage"
"-i", "--fv-image", dest="FvImage"
"-C", "--capsule-image", dest="CapName"
"-u", "--skip-autogen", dest="SkipAutoGen"
"-e", "--re-parse", , dest="Reparse"
"-c", "--case-insensitive", dest="CaseInsensitive"
"-w", "--warning-as-error", dest="WarningAsError
"-j", "--log",  dest="LogFile"
"-s", "--silent",, dest="SilentMode",
"-q", "--quiet"
"-v", "--verbose"
"-d", "--debug"
"-D", "--define",dest="Macros"
"-y", "--report-file"dest="ReportFile"
"-Y", "--report-type" choices=['PCD','LIBRARY','FLASH','DEPEX','BUILD_FLAGS','FIXED_ADDRESS', 'EXECUTION_ORDER'], dest="ReportType"

"-F", "--flag", dest="Flag",
"-N", "--no-cache", dest="DisableCache"

從上面資料中可以看到-a 或是--arch對他來說應該都是同一個選項.
而底下是一些實際範例的說明,希望對大家有幫助~

======================
build.exe  -p ACTIVE_PLATFORM 
======================
ex: build -p DUETPkg\DuetPkg64.dsc
說明: 等同於修改Target.txt內的 ACTIVE_PLATFORM       = Nt32Pkg/Nt32Pkg.dsc

=====================
build -b TARGET
=====================
ex: build -b DEBUG
說明: 等同於修改Target.txt內的TARGET= DEBUG,以及DSC file: [Defines] BUILD_TARGETS tag

[Defines]
  PLATFORM_NAME                  = NT32
  PLATFORM_GUID                  = EB216561-961F-47EE-9EF9-CA426EF547C2
  PLATFORM_VERSION               = 0.4
  DSC_SPECIFICATION              = 0x00010005
  OUTPUT_DIRECTORY               = Build/NT32
  SUPPORTED_ARCHITECTURES        = IA32
  BUILD_TARGETS                  = DEBUG|RELEASE
  SKUID_IDENTIFIER               = DEFAULT
  FLASH_DEFINITION               = Nt32Pkg/Nt32Pkg.fdf

=====================
build -a TARGET
=====================
ex: build -d x64
說明: 等同於修改Target.txt內的TARGET_ARCH           = IA32,以及DSC file: [Defines] SUPPORTED_ARCHITECTURES tag (同上範例)

=====================
build -t TOOL_CHAIN
=====================
ex: build -t VS2010x86
說明: 等同於修改Target.txt內的TOOL_CHAIN_TAG        = VS2008x86 

=====================
build --log=Build.log
=====================
--log 可以產生建置過程的紀錄檔

星期日, 9月 09, 2012

快快樂樂學EFI(4)-使用VS2010建立EDKII專案

這一篇文章說的方式可以適用於VS2008與VS2010,使用Visual Studio建立專案的好處其實就只是有Tag功能,也就是方便你去追CODE改CODE的功能,雖然我都是使用SlickEdit 不過還是跟各位說一下怎麼使用吧~

在建立Visual Studio專案之前,請確認你已經在DOS Command Prompt下成功進入到NT32的EFI Shell模擬環境,如果還沒成功,請先試試看下面方式:

1) E:\MyWorkSpace:\> EdkSetup.bat
2) 修改E:\MyWorkSpace\Conf\Target.txt 內,搜尋關鍵字MYTOOLS ,並把他改成VS2008x86或是VS2010x86,我是用VS2010,所以要改成VS2010x86

3) 先產生 SHELL檔案,透過 E:\MyWorkSpace:\> build -D BUILD_NEW_SHELL
4) 測試看看能不能看到EFI Shell模擬環境E:\MyWorkSpace:\> build run
5) 如果可以看到Shell,則輸入reset 離開模擬環境

如果上面步驟都已經成功,則你可以繼續底下的步驟來設定VS2010的EDKII專案


Step1: 執行VS2010
Step2: 選擇File->New->Project From Existing Code ...
Step3: 出現的畫面上選擇"Visual C++" project type 


Step4: Click "Browse" 然後選擇你的工作目錄 (我的是E:\MyWorkSpace)

Step5: 並在File type的地方輸入底下這些附檔名,他的用意是去辨識哪些檔案要加入專案

 *.c;*.h;*.asm;*.asm16;*.s;*.inc;*.asl;*.aslc;*.fdf;*.dsc;*.dec;*.inf;*.py


Step6: 繼續下一步,並選擇 "Use external build system" 然後直接按下 "Finish" (後面的其他設定可以忽略)


Step7: 在步驟6結束後,你應該可以看到專案檔被開啟成功,然後在專案的地方按滑鼠右鍵,然後選擇"Properties"

Step8: 選擇左邊的 "NMake" 然後設定 Configuration 成 "All Configurations".


Step 9: 然後再編輯右邊的 "Build Command Line","Rebuild All Command Line" 和 " Clean Command Line" ,分別輸入下面的設定(請依照自己的工作目錄設定):

For Build Command Line:
------------------------------
   cd /d E:\MyWorkSpace
   set WORKSPACE=E:\MyWorkSpace 
   call edksetup.bat --nt32
build 

For Rebuild All Command Line:
------------------------------
cd /d E:\MyWorkSpace
  set WORKSPACE=E:\MyWorkSpace
  call edksetup.bat --nt32
  build clean
build 

For Clean Command Line:
------------------------------
cd /d E:\MyWorkSpace
  set WORKSPACE=E:\MyWorkSpace
  call edksetup.bat --nt32
  build clean

Step10: 確定你的工作目錄下的Conf\Target.txt內的TOOL_CHAIN_TAG有設定成VS2010x86,不然你會沒辦法使用VS2010的專案來Compiler,如果你是使用VS2008則設定成VS2008x86即可! 

Step11: 再選擇一次專案的"Properties",然後選擇左邊的"Debugging",接著邊及右邊的這兩個選項:




Step12:  當上述的動作都完成了,你就可以試試看Rebuild和Start Debugging的功能了.

成功的話,你會看到EFI Shell的模擬畫面! 


※ 本篇文章是參考我以前同事部落格所多做的一些說明,如果你需要更仔細的說明,請參考我以前同事 Tim Lewis 的部落格~ 










星期四, 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的模擬環境,所以你沒辦法在你的工作機上運行。