UEFI原理與程式設計(一):環境搭建

kaliopensourcextu發表於2017-03-11

前言

最近在搞UEFI環境下的一些程式設計。對於我這種從未接觸過EFI的菜鳥程式設計師來說,前面開發環境搭建,程式設計細節等等在沒有人指導情況下,走了很多彎路。在網上查資料的時候,也有發現網上面的資料大多過時,或有關鍵步驟的缺失,碰壁不少。今天我就詳細的把我這幾天被搞的體無完膚的過程分享一下,希望有和我一樣剛接觸UEFI程式設計的各位能有一些幫助。

一、EDK II and Support Tool Download

1、做UEFI開發的話,首先需下載EDK II環境,可以在官網下載,也可以在SourceForge上面查詢,下面貼出 EDKII的github:
                  https://github.com/tianocore/edk2.git

如果你看到眾多名字如:EDK、EDKII、UDK2010、UDK2014、UDK2015....,解釋如下
a、EDK 較早的東西了
b、是現在Intel力推
c、UDK比較穩定的EDKII
注:解釋來自於biosren。在選擇下載那個版本的時候,我開始是抱著求穩態度,下載一些低版本,後來在時間過程中各種坑,弄得是灰頭滿面。所以我推薦就去github上下載最新的吧,至少我用到現在沒發現什麼問題。PS(我下的是UDK2015,前幾天看最新已經有UDK2017 了  -。-!!!)
2、VS2008 (確保64位編譯器也有),你也可以選擇其他的版本如:VS2010,。其實當你安裝了EDKII之後,你可以在Conf\tools_def.txt 這個檔案下看到所有編譯器,而且要要查它的配置是否正確,這個後面會有提到。那麼現在我就列出我現在安裝的UDK2015下面所支援的:
a、VS2003(32bit)
b、VS2005(32bit、64bit)
c、VS2008(32bit、64bit)
d、VS2010(32bit、64bit)
e、VS2012(32bit、64bit)
f、VS2013(32bit、64bit)
g、DDK3790 
h、UNIXGCC
i、 GCC44 - GCC49
k、CLANG35 
l、 ELFGCC
 j、CYGGCC
k、ICC\ICC11
當然這些根據你下載的EDKII的版本情況而定,而我現在用的就是VS2008。 VS這個大塊頭做軟體的應該都知道。
3、Windows SDK,下載了安裝了VS應該都有,如果沒有的話可以自己去官網下載。        

4、IASL compiler
http://www.acpica.org/downloads/binary_tools,ps:打不開的話,自己Google/baidu,自行下載就好,下載好後把它們COPY到C:\ASL裡面。原因後面會講,我曾在這裡進過坑。

5、openssl-1.0.2d package + patch 
其實就是需要用patch對openssl打補丁,具體操作可以看UDK2015.Complete.MyWorkSpace.zip 裡面 MyWorkSpace\CryptoPkg\Library\OpensslLib\Patch-HOWTO.txt
其實不看也沒有關係,我在後面會有講到,但是注意如果你的版本與我選擇的不一樣,你需要看看上面我說的那個說明文件檢視具體操作

6、EADK
EADK 提供了標準的庫,包含了一些C的stand library,並且提供了浮點運算的可能。 Just for UEFI Application!
注:如果使用UDK2015 或>2015,請下載教新的EADK,Do not use EADK1.02 或EADK_A2 !

二、EDKII Setup

1、將UDK2015解壓
因為我們用的是Windows,所以我們將Base Tool(Windows).zip 和UDK2015.MyWorkSpace.zip 解壓到 :D:\EDK2 資料夾下
注意,如果你看有些網上資料和一些書本(UEFI原理與程式設計)描述的結構是將UDK2015.MyWorkSpace.zip解壓後MyWorkSpace資料夾下的內容提到了D:\EDK2資料夾下,你可以解壓之後把它們提到父目錄D:\EDK2裡面,與一些教程資料保持一致。當然,如果你知道這些,在你build的時候可以自己定義配置。
2、Generate OpenSSL * Crypto Library
其實這步在前面有提到過,我發個圖片:
          
在最下面Patch-HOWTO.txt 裡面有詳細的步驟。我大概吧裡面的內容貼出來,你如果想看詳細的,可以去檢視這個file。
For Windows Environment:
    ------------------------
    1) Make sure the patch utility has been installed in your machine.
       Install Cygwin or get the patch utility binary from
       http://gnuwin32.sourceforge.net/packages/patch.htm
 
  2) cd $(WORKSPACE)\CryptoPkg\Library\OpensslLib\openssl-1.0.2d
    3) patch -p0 -i ..\EDKII_openssl-1.0.2d.patch
    4) cd ..
    5) Install.cmd

3、將IASL 解壓,然後把編譯器copy到C:\ASL資料夾下
這些前面有說過,具體原因,還得往下看   -。- h

4、開啟用管理員許可權開啟CMD,進到 D:\EDK2 : CD /D D:\EDK2 ,執行 edksetup.bat  結果如下:

注意: 請忽略 WARNING 的內容

5、這時候,你需要開啟EDK2資料夾,發現裡面有一個Conf的資料夾,開啟後,我們需要對其中target.txt 和 tools_def.txt 連個檔案進行配置。
                                                                            
a、target.txt 主要是對TOOL_CHAIN_TAG,進行配置,這裡偷懶引用UEFI原理與程式設計上面的圖:
                                            
            請注意,32位機器,填寫的是VS200?,而64位機器32位VS 才填 VS200?x32
b、tools_def.txt 主要是檢查自己的編譯器的路徑是否正確
比如我的VS2008是裝在D:\Visual Stadio2008,那麼我設定的路徑也要正確,如下:
         
             請注意,請根據自己情況進行設定。
好了,我們在這裡仔細查詢發現了,tools_def.txt 對IASL的預設設定,直接上圖:


發現它的路徑預設是C:\ASL,好了前面留的懸念解釋了。如果你想自定義的話,保持一致就好!
6、下面我們要講一下NT32模擬器的編譯。
首先,這一步的目 的可以再NT32模擬環境下執行我們的EFI檔案,我們就可以在模擬環境下對efi檔案進行測試了interesting,當然,使用模擬環境是有缺陷的,後面再講。
步驟:
a、D:\EDK2>edksetup.bat --nt32
b、D:\EDK2>build
注:在步驟b可能會花一點時間去build,這是可以理解的。
c、build完之後,如果沒有什麼問題,它應該是這個樣子的:

        或許你已經看到,我build只花了30s,這不是我機器效能比較好,這只是因為我之前已經build過了。而這次的build只是檢查了與上次build的改動。如果你檢視生成的檔案,你會發現他們的修改日期是你上次build done的時間。當然前提你沒有對檔案進行改動,如果改變了,肯定會花點時間去重新build的。
7、講一下如何執行NT32模擬器
非常簡單: build run
但是,請注意,在你build run 之前,你需要執行 edksetup.bat 來載入edkii的環境。
8、退出NT32模擬環境
just use: reset 命令即可!

三、利用U盤進行UEFI啟動

        其實,估計你已經在網上或參考書上查過了怎麼製作,可你還是失敗了,尤其是在Legacy BIOS平臺下。但是我在實際操作過程中,發現有漏步驟的情況,原因應該是版本的原因。
         講一下這裡是幹嘛的:前面又提到在NT32模擬環境下有些缺陷,目前我遇到的是UEFI程式設計中,我們會使用到protocol,但是在NT32模擬環境下有些protocol並沒有裝置進行掛載。以至於我們不能測試我們的程式。此時就需要我們在本機UEFI環境下進行測試。我還遇到過其他的情況,在此不一一列舉,前面不知道有這一情況,我真是被搞得不要不要的 - 。-!
1、首先介紹在UEFI平臺下USB盤製作
easy,估計你在網上查過 簡單說: 1、格式化U盤 FAT(我是FAT32)
    2、U盤建立efi\boot
    3、將efi程式COPY到上面目錄,重新命名為bootia32.efi 或 bootx64.efi 看你是屬於哪個
Ok了。
原理其實就是UEFI的啟動檔案是上面路徑下的boot檔案。。。interesting。。。

2、Legacy BIOS 平臺。

        其實大家都知道要用到DUET,我也是。但是剛開始我利用網上的教程,和參考書上的做法卻不行,後來我檢視DuetPkg 資料夾下的ReadMe.txt 發現UDK2015 需要多一個步驟,下面貼出詳細步驟,當然你也可以去檢視這個檔案。
此處的U盤碟符設為e: ,根據自己的情況改動
a、build Duet platform module
->CD /D D:\EDK2
->edksetup.bat
->build -p DuetPkg\DuetPkg.dsc -e IA32    注:64bit :build -p DuetPkg\DuetPkg.dsc -e X64
->CD DuetPkg
->PostBuild.bat IA32   注:64bit:PostBuild.bat X64
b、Create boot disk
->插U盤
->CreateBootDisk.bat floppy e: FAT12 IA32   注 : 64bit : CreateBootDisk.bat floppy e: FAT12 X64  (資料網上缺此步,應該是原來版本是在最後一步完成的)
->CreateBootDisk.bat usb e: FAT32 IA32      注 : 64bit : CreateBootDisk.bat usb e: FAT32 X64      (資料網上缺此步,應該是原來版本是在最後一步完成的)
->拔出U盤,然後再插上
->CreateBootDisk.bat usb e: FAT32 IA32 step2   注:64bit  :CreateBootDisk.bat usb e: FAT32 X64 step2
      經過此步驟,就OK了。可以重啟從U盤啟動進行試驗進入UEFI shell,輸入fs0:就可以進入U盤的根目錄了。。。。interesting
DUET 是基於Legacy BIOS 提供了UEFI模擬器,提供了在傳統BIOS系統上的UEFI環境。
3、在這裡的坑內掙扎很長時間,因為我的efi程式根本無法執行。現在有了這步,就可以對自己寫過的程式進行測試了interesting

注:在此環境下UEFI的Shell 命令是可以很好地執行的,你可以試一下,比如
Shell》PCI    # 這個命令會列出你的機器上PCI Device ,包括BUS DEV FUN VID DID  CLASSNAME 等資訊。

4、總結

     到此,EDKII SETUP 都寫完了。前一段時間部門開會,BIOS那邊的一位leader說過一句話:“只有做BIOS的才懂BIOS人。”確實,對於我這個做軟體的之前沒有了解過BIOS/EFI,在這短短几天接觸EFI讓我頭大。不是難得不行,而是缺乏中文資料,問題得不到解答,只能自己不斷嘗試,不斷的檢視Spec。頭痛的60%與看英文Spec有關 -。- !!!。所以,這篇文章主要針對要寫EFI程式的但是從未接觸過EFI但是需要搭建EFI環境的軟體人員。只希望,各位能順利搭建環境,寫好程式碼,Build成功,測試OK,完成任務,然後遠離這些東西,珍愛腦細胞 -。-!!!



相關文章