嗨我是k66,Day8提到UEFI_APPICATION分3類:UefiMain、main、ShellAppMain,Day8時因使用的UefiMain而不支援C語言的<stdio.h>,本篇就來使用main寫支援<stdio.h>的printf(),寫出No Pig Killing字樣!
正文開始!程式碼連結
分5步驟:
AppPkg/與StdLib/兩資料夾並放至C:\edk2space\edk2\[註1]AppPkg/
AppPkg/
ACTIVE_PLATFORM = AppPkg/AppPkg.dsc
下載AppPkg/與StdLib/兩資料夾並放至C:\edk2space\edk2\[註1]
寫k66StdLib.c並放至AppPkg/
#include<stdio.h>
int main(int args, char **argv){
printf("Oink! This is <stdio.h> in UEFI!\n");
}
AppPkg/
[Defines]
INF_VERSION = 0x00010006
BASE_NAME = k66StdLib
FILE_GUID = 27413edb-fbb1-46b1-a43d-7c1268c6b31e
MODULE_TYPE = UEFI_APPLICATION
VERSION_STRING = 0.1
ENTRY_POINT = ShellCEntryLib # 注意是ShellCEntryLib而非ShellEntryLib
VALID_ARCHITECTURES = X64
[Sources]
k66StdLib.c
[Packages]
MdePkg/MdePkg.dec
ShellPkg/ShellPkg.dec
StdLib/StdLib.dec
[LibraryClasses]
LibC
LibStdio
ShellCEntryLib
ACTIVE_PLATFORM = AppPkg/AppPkg.dsc
k66run1.bat
edk2setup.bat Rebuild
build // 看到Done表示編譯成功
將C:\edk2space\edk2\Build\AppPkg\DEBUG_VS2019\X64\k66StdLib.efi放至C:\QEMU\Test\後,執行QEMU。畫面如下:
本篇我們學會如何在EDK2環境中使用標準C函數庫stdio.h(main),在Day7也學會UefiMain的方式在螢幕輸出,因兩者皆為UEFI_APPLICATION,故皆能在UEFI Shell上執行。
但一個像樣的開機畫面,不單只有輸出文字,也要有圖片。這會牽涉到loader與kernel概念,會在下一篇介紹。
我們明天見!
[註1]uefi-lib來源: https://github.com/tianocore/edk2-libc/blob/master/,我們會使用到AppPkg/與StdLib/兩資料夾。
UEFI_APPICATION的3類
UefiMain、main、ShellAppMain,前二類在Day8、Day10(本篇)實作,試著實作第三類吧!