今天簡單介紹一些shell下的程序設計:
和其他的語言的程序設計有所區別,shell環境下的程序設計需要借助package(包)來完成。在edk2的目錄下可以清楚的看到有很多package:比如ShellPkg、MdePkg、MdeModulePkg等等。每個Pkg里面包含的函數又有所區別,所以編寫一般的簡單的程序一般都會放在默認的編譯的Pkg里面(特殊的除外)。
默認的編譯的Pkg的路徑在 edk2/Conf/target.txt 可以找到比如我使用的就是 “ ACTIVE_PLATFORM=EmulatorPkg/EmulatorPkg.dsc” 這個.txt文件里面還包括默認的編譯器,編譯模式,IA32還是X64等等,這其實是一個基礎的配置文件。
shell下的可執行程序文件形式為 .efi 文件,編譯生成它最少需要一個.inf 文件和一個.c 文件(也常被叫做工程文件和源文件)
應用程序模塊常見的分三種,分別為標准的應用程序模塊,shell應用程序模塊,使用main函數的應用程序工程模塊。(其中最后一種我沒弄出來,它需要借助標准的C庫中的stdio.h 嘗試了一段時間並沒有成功) 先說說標准的應用程序模塊
首先是工程文件代碼:
[Defines] INF_VERSION=0x00010005 BASE_NAME=UefiMain //最終生成的efi文件的名字,例如UefiMain.efi FILE_GUID=6987936E-ED34-ffdb-AE97-1FA5E4ED2117 MODULE_TYPE=UEFI_APPLICATION VERSION_STRING=1.0 ENTRY_POINT=UefiMain //入口函數 [Sources] main.c //源文件路徑 [Packages] MdePkg/MdePkg.dec //引用到的包的聲明文件 [LibraryClasses] //鏈接到的庫模塊 UefiApplicationEntryPoint UefiLib
源文件代碼:
#include<Uefi.h> EFI_STATUS UefiMain(IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE *SystemTable) { SystemTable->ConOut->OutputString( SystemTable->ConOut,L"hello,,,,,ourworld\n" ); return EFI_SUCCESS; }
源文件和工程文件放在一起,然后去默認的Pkg里面的.dsc文件里面把它的路徑加上
如上圖右下角所示把工程文件的路徑添加完成即可。
最后打開cmd 運行edksetup 然后再build (參考上一篇博客)不出意外應該能編譯成功 。編譯所得的efi文件在build文件夾里面,以我的為例是在
edk2/Build/EmulatorIA32/DEBUG_VS2015x86/IA32 里面(因為我的默認編譯是emulatorpkg)
打開uefi shell 虛擬環境 輸入fs0:按回車 注意冒號
然后ls查看所有文件 應該能看到uefimain.efi
輸入uefimain.efi 回車即可運行程序,輸出想要的結果
如有遇到什么問題可以參考書籍《UEFI原理與編程》