iT邦幫忙

2023 iThome 鐵人賽

DAY 10
1

嗨我是k66,Day8提到UEFI_APPICATION分3類:UefiMainmainShellAppMain,Day8時因使用的UefiMain而不支援C語言的<stdio.h>,本篇就來使用main寫支援<stdio.h>的printf(),寫出No Pig Killing字樣!


正文開始!程式碼連結


分5步驟:

  1. 下載AppPkg/StdLib/兩資料夾並放至C:\edk2space\edk2\[註1]
  2. 寫k66StdLib.c並放至AppPkg/
  3. 寫k66StdLib.inf並放至AppPkg/
  4. 修改C:\edk2space\edk2\Conf\target.txt: ACTIVE_PLATFORM = AppPkg/AppPkg.dsc
  5. build執行

  1. 下載AppPkg/StdLib/兩資料夾並放至C:\edk2space\edk2\[註1]

  2. 寫k66StdLib.c並放至AppPkg/

#include<stdio.h>

int main(int args, char **argv){
    printf("Oink! This is <stdio.h> in UEFI!\n");
}
  1. 寫k66StdLib.inf並放至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
  1. 修改C:\edk2space\edk2\Conf\target.txt:
ACTIVE_PLATFORM = AppPkg/AppPkg.dsc
  1. build執行
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/兩資料夾。


自我挑戰4

UEFI_APPICATION的3類UefiMainmainShellAppMain,前二類在Day8、Day10(本篇)實作,試著實作第三類吧!


上一篇
【Day 9】完全理解UEFI格式!Module、INF、Package、DSC、DEC
下一篇
【Day 11】實作UEFI開機畫面—功能設計
系列文
世界第一簡單的UEFI,實作打造自己的開機畫面31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言