嗨我是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(本篇)實作,試著實作第三類吧!