小華的部落格

搜尋此網誌

網頁

星期二, 9月 16, 2014

EDK2/EDKII Python Build Tool 兩三事 (Build.py)

EDK2 Python Build Tool 兩三事

最近因為工作需要,所以不得已逼自己去把EDK2 Python Build source code看完,看完後順便整理一下一些小重點,以免過陣子自己又忘記了。

     1)EDK_GLOBAL 
     這種定義的Macro只能給EDK1 driver使用,因為他會去檢查.inf 內的
     INF_VERSION  = 0x00010005 ,如果大於或是等於這個值就是當成EDK2,如果找不到這個值就會當成是EDK1。

因為不好用,所以就隨手改了一下CODE,讓他通吃EDK1 + EDK2 + FDF + DSC + DEC + INF

   2) Build Rule and Package rule
   在EDK2 中,他把EDK1原本的Build Rule & Package Rule 分別描述成:
        Tools_def.txt 
        Build_Rule.txt
        [Rule.$(Arch).$(ModuleType] 

好不好用看個人,不過如果你要支援原本EDK1 Package Rule時那就對不起啦,你要修改Python source code,不然你做不到。  例如說底下的EDK1 的COMPONENT_TYPE = FILE原本對應到某個Package Rule,但是在EDK2內不支援就是不支援,除非自己改python source code.

[Defines]
BASE_NAME               = xxxxx
FILE_GUID                   = 126A4D6A-C404-4200-8779-F327A4A79087
COMPONENT_TYPE  = FILE
BUILD_TYPE               = MAKEFILE

   3) Python v.s SQL
   Python build tool 只是拿SQL當成是存放他收集到的資料的一個地方,然後在另一個地方就可以去撈資料庫內的資訊然後寫對應的CODE去分析要幹嘛,所以rebuild的時候最好把這個資料庫暫存檔案刪除。 EX: Conf\.cache\build.db

   4) GenSection & GenFFS
   以前EDK1的這兩個工具也整合進去Python Build tool內了,所以想了解FDF是怎麼產生FV或是FD的人就請自行研究,不過他是另一隻Tool叫做GenFds.py。

   5) AutoGen.c v.s AutoGen.h
   偷偷產生的檔案用來存放一些PCD操作/有用到的PCD Value,GUID 定義跟一些偷塞的include... 如果是給PCD database使用的,他還會塞Dynamic PCD給PCD 資料庫當成初始化值。

    另外,Library 只會產生AutoGen.h 不會產生AutoGen.c,因為Library通常會跟某個Driver Link,所以等到真正要去產生Module make時,才會去檢查Library 內用到的GUID/PCD ,然後產生在Module's AutoGen.c內。

    6) Hard code
    恩,很多東西都寫死在Python build tool內,像是nmake command 要增加修改時就要改一改他,不過也是個好處,就是我可以偷加很多東西在裡面,然後不給你source code...哈!!!

   7) 產生執行檔
    .py  轉成 .exe 方式我自己再用的有兩種,一種是py2Exe不過版本過舊已經不能支援了,所以我採用EDK2 所建議的cx_Freeze 去轉換,轉換時還要搭配你的Python 版本,目前我看到的codebase內使用的是Python 2.7.3,所以應該以這個為主吧! 底下是EDK2 建議的方式:

Using cx_Freeze 4.2.3 with Python 2.7.2
Using cx_Freeze 3.0.3 with Python 2.5.4

  8) 嗯...有想到再說~


     
   




星期三, 2月 12, 2014

Python v.s UEFI EDK2 (EDKII)

這篇文章主要是幫自己紀錄一下學習EDK2 build process時的前置準備動作有哪些,後面會陸陸續續把這篇文章補齊,所以先留下個紀錄吧~

學習方式

    對於EDK2來說最大的轉變就是我一直提到的Build process,我常跟我周遭朋友說如果你要學好BIOS或是其他大型軟體專案,中間的『眉角』就是要把大型專案的學習方式分成:

     BUILD + CODE

當你有辦法分辨以及分開學習時,你才可以精準的掌握住甚麼是BUILD? 甚麼是CODE?
舉例來說,BUILD的部分就是屬於build rule/compiler rule/package rule ,簡單的說就是透過一些方式來把程式碼產生成binary,依照一些特定的layout來產生成一個BIOS ROM image;至於CODE的部分就屬於程式語言,像是C語言,組合語言的學習! 你唯有了解彼此之間的關係,你才能掌握關鍵處! 這也是我常跟朋友開玩笑說,你真的會"build+code"嗎?!

至於BUILD PROCESS的概念中,我也常常教導朋友去思考為什麼要這樣子做? 他解決了甚麼問題? 有沒有其他方式? 因此我常常由一個批次檔的概念外加一些淺而易懂的範例來讓他們知道說原來BUILD PROCESS原理是如此簡單,不過我沒打算在這邊寫詳細的解說,因為配合著畫圖邊解釋效果比較佳,如果大家有興趣又剛好在業界遇到我時再來跟我討論吧! ^^

所以記得,學習的方式就是BUILD + CODE分開來學!!!

前置動作
   有鑑於EDK2 BUILD PROCESS主要的部分已經改成Python 2.5/2.7開發,美其名是為了跨平台而準備,但是實際上卻沒有達成!  畢竟,EDK2在x86中並沒有拿Python 將所有win32 的工具重新寫一次,導致在x86平台中有一部分的python tool跟一部份的win32 tool,所以只能說『某些BUILD TOOLS』跨平台而已! 但是木已成舟,所以現在的x86上就變成了這個怪胎情況了!

   雖然我不討厭Python,但也不是擁護者,因為跨平台方式有很多種,他也不是最好的一種! 但是因為EDK2都選擇了Python,所以我也要強迫自己來學習他,秉持著工欲善其事,必先利其器的方式,我們先把除錯工具安裝好,以方便我們去分析與研究EDK2's Build.py

那有哪些東西要先安裝呢? 我個人偏好Visual Studio,因此我選擇了VS2010+PTVS 來當作是Debugger,安裝簡單! 當然你也可以選擇使用Eclipse Classic IDE + PyDev 的除錯方式 (感謝鳥公司John大大傾囊教學)!

所以如果你也想學Python,請跟著我一起安裝:

1. VS2010

2. Python tool for Visual Studio
https://pytools.codeplex.com/

3. Python 2.7.6 (目前EDK2還沒支援到Python 3.x,建議是安裝2.5.x/2.7.x)
http://www.python.org/download/releases/2.7.6/

Eclipse Classic IDE+PyDev

VS2010+PTVS


(未完待續...)










星期二, 1月 21, 2014

文字檔格式真多,那怎麼去區別ASCII/Big5/UTF-16/UTF-8呢?




以前處理一些字幕檔的時候,慢慢的累積了一些區別文字檔編碼的經驗,這邊就分享一下個人經驗,不過經驗歸經驗不一定正確,所以各位就將就點看,把他當成是解決你問題的一個進入點,然後再去搜尋相關知識來解決各位遇到的問題吧!

首先,我們先討論一下文字檔到底是啥? 其實不管是甚麼檔案,儲存的時候都是BINARY資料,差別就在於讀取檔案的人想要如何呈現給你看而已~

例如:

執行檔=二進制資料   , OS 讀取表頭判定他可以被執行,然後執行他!
文字檔=二進制資料   , Editor 讀取他然後依照一些編碼原則判定他,然後再去字型檔撈出字型顯示給你看!

所以啦,這篇文章要說的就是模擬一下如果我寫了一個Editor,我要怎麼區別不同的編碼格式!

從上面的圖中可以看到,一開始的時候我會先去讀取兩個位元組,這是因為Unicode(UTF-16)檔案會有一個標記來標記他是Unicode存取方式是Big Endian還是Little Endian (低位元組在記憶體低位址, x86常用) ,所以大家可以把UEFI 中的.uni 用16進制編輯器打開來看看,就會看到檔案最開頭有這個標記可以用來判斷~

如果沒有這個標記的檔案,我們就可以判斷為他可能是ASCII/UTF-8/Big-5的編碼方式,因為Big5是兩個位元組組成,他有他一定的規範,所以可以由這些規範來判別字元是不是Big5或只是單純ASCII的一個位元組而已~

除此之外,還有一個UTF-8比較討厭,因為UTF-16是固定兩個位元組儲存一個字元,所以像是英文"A"就會是0x0041 ,高位元組永遠是0x00,所以為了節省空間所以變成了可變位元組的編碼,因此一個字元可能由1~6 bytes組成,看樣子還有機會繼續延伸咧~

因此可以參考Wiki上的UTF-8的對應方式去判讀一個字元由幾個Bytes組成。

例如: 中文字 [這]
這=E9 80 99 (UTF-8)

第一個位元組的二進制是1110 1001前面的'1'代表全部是3 bytes,而後面的每個位元組的bit7:6就是對應Wiki上說的欄位表示  10xx xxxx, 10xx,xxxx

所以取出來的xxxx xxxxxx xxxxxx 
                            |       |              |____   011001    19
                            |       |____________   000000    0
                            |_________________  1001        9

U+9019 就是unicode的中文字 [這],所以UTF-8 也算是再重新編碼後的一種unicode表示碼!

不知道舉的這些例子看倌們能否了解?!

因為這不是我的專長,我是寫BIOS的,以上是經驗談~ Orz



星期二, 1月 07, 2014

UEFI Gop driver and PlatformGopPolicy

最近在除錯我自己從無到有DIY出來的EDKI codebase的問題,所以在這邊留一下筆記來記錄一下UEFI Gop driver遇到的問題~

問題描述: 
由於我們的系統比較特別,有eDP Panel 跟LVDS Panel(銷庫存),所以外掛了一顆eDP-LVDS IC,導致點亮VGA的方式變得複雜了點,另外我的CODEBASE目前還很陽春,所以只支援UEFI mode,也就是我要直接上UEFI GopDriver,而執行到UEFI Gop Driver後系統就當機了,為了這個問題所以把這隻Gop driver 反組譯,然後大致追了一下,然後把追CODE的筆記紀錄在下面!

筆記:
1) 他是一個EFI driver model driver,所以從DriverBinding Start()追進去看他做了甚麼事情
2) 底下是我整理的資料,因為沒有他的Source code,完全靠反組譯去猜測出底下的順序與動作,所以僅供參考,並不一定正確!
3)Root cause: 還不清楚,還在追...哈!

DriverBinding->Start()
{
   1..asm{RDTSC};
   2.ProgramIGD();
        a. OpenProtocol(Pciio) //準備用來讀取PCI Regs
        b. Pciio->Attributes(Enable BusMatser,MMIO,IOBASE) //啟動IGD設備
        c. OpenProtocol(DevicePath) 
        d.LocateProtocol (PlatformGopPolicy) //要求Platform firmware(也就是BIOS)提供VBT/Lid/Dock 的資訊
        e. PlatformGopPolicy->GetVbt(Address,Size);
        f. Config/Read IGD PCI Regs (DeviceId,RevisionId...etc)
        g.Read  Pch DeviceId and RevisionId.
        h.Init MMIO regs   // 目前還找不到相關文件說明這些暫存器在幹嘛
        i.Out 0x3c2,0x67
        j.Config MMIO regs 
        k. PlatformGopPolicy->PlatformLidStatus()
        l.  PlatformGopPolicy->PlatformDockStatus() if PlatformGopPolicy's revision > 0x0001 otherwise, ignore it.
        m.Create DDEV LinkedList (Display Device) //應該是參考Vbt去建立出來的資訊 CRT->eDP->EFP1->EFP2->EFP3
        n.Walk DDEV LinkedList to find out predefined DDEV and then try to enable it. (Hangup here.) //我當機在這裡
        o.Others //還沒追...應該是去產生一些protocol (EDID,brightness...etc) 或是devicepath 
   3.asm{RDTSC};
}

4)會被產生出來的Protocol掛自Child Handle上: 
a.DevicePath (09576E91-6D3F-11D2-8E39-00A0C969723B)
b.Undocument protocol (39487C79-236D-4666-87E5-09547CAAE1BC) : 不知道是幹嘛的...
c.EdidDiscovered (1C0C34F6-D380-41FA-A049-8AD06C1A66AA): 用來表示於顯示設備使用這個EDID.
d.GraphicOutput(9042A9DE-23DC-4A38-96FB-7ADED080516A):用來顯示影像
e.EdidActiveProtocol(BD8C1056-9F36-44EC-92A8-A6337F817986) : 正在顯示的設備使用這個EDID

如果SizeOfEdid !=0 代表EDID資料應該是有效的,應該可以檢查此Handle上面有沒有EDID Protocol來得到顯示設備的EDID,就像是Legacy 時呼叫INT 10h.

星期五, 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".)
           
        最後,希望大家都能夠成功建立自己的建構環境!