UEFI Shell 下的程序設計


  今天簡單介紹一些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原理與編程》

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM