2023年12月8日发(作者:)

UEFI-建立属于自己的Application和library

为了能更好的理解code编译过程,我们可以通过学习操作如何进行自建并自用library去更好的理解

code的编译过程:

1. 在建立library之前,首先要写一个属于自己的Application并成功运行,这样才能在Application里面调用到自己的library:

(1)在edk2的随便一个文件夹下创建一个文件夹,名称则是你的Application的名称,文件夹里面有最基本的文件(.inf和.c)。

(2)在.c文件中写上最基本的print(helloworld)和print相关的包和库:

#include

#include

#include

EFI_STATUS

EFIAPI

UefiMain (

IN EFI_HANDLE ImageHandle,

IN EFI_SYSTEM_TABLE *SystemTable

)

{

Print(L"hello world!");

return 0;

}

(3)在.inf文件中配置[Defines],[Sources],[Packages],[LibraryClasses]几大基本部分:

#

定义了模块类型

(MODULE_TYPE)

、模块的名字

(BASE NAME)

#

版本号(

VERSION STRING)

、人口函数

(ENTRY POINT)

等。

[Defines]

INF_VERSION = 0x00010005

BASE_NAME = hqx

FILE_GUID = F120EDB2-FBE6-4847-89E6-03F79085FEED

MODULE_TYPE = UEFI_APPLICATION

VERSION_STRING = 1.0

ENTRY_POINT = UefiMain

UEFI_HII_RESOURCE_SECTION = TRUE

#

定义了本模块包含的源文件或目标文件。

[Sources]

hqx.c

#

指明了要引用的包,包中的头文件可以在库的源文件中引用。

[Packages]

MdePkg/

MdeModulePkg/

#

列出了需要链接的库

[LibraryClasses]

UefiApplicationEntryPoint

UefiLib

(4) 在codeDT01_SVN_2BoardOemH46PanguBoardPkg文件夹中找到找到[Components.$(DXE_ARCH)],在这部

分添加自己写的Application的包路径地址:

[Components.$(DXE_ARCH)]

(5)以上步骤完成之后就可以点开运行(codeDT01_SVN_2BoardOemH46PanguBoardPkg)运行code,依次

执行一下命令,编译成功后在

codeDT01_SVN_2BuildH46PanguBoardPkgRELEASE_DEVTLSxVC14X64HqxPkgApplicationhqxForHqxPkghqxO

UTPUT会生成我们需要的.efi文件:

#

清除上次编译生成的文件

nmake clean

#

启动一些数据

#

编译整个

code

文件

nmake uefi64

(6)重启进入UEFI,执行.efi文件:

2.完成了第一个步骤就证明你已经建立了属于自己的Application并让它成功跑起来了,但是我们刚刚使用的print是调用uefilib库下的库函

数,那我们能不能调用自己的库然后再去调用uefilib呢?下面我们的重点来了:我们要自己建立library然后去使用它

2.1 建立自己的库(library):

(1). 在 MdePkg的Library中建立自己库名字的文件夹:

(2).在自己库的文件夹中建立基本的.c文件.inf文件和必须的UefiLibInternal.h文件:

.c文件中封装好print函数:

#include "UefiLibInternal.h"

#include

VOID

HqxShowString(

)

{

Print(L"welcome to my library!");

}

.inf中也是配置好[Defines],[Sources],[Packages],[LibraryClasses]几大基本部分:

[Defines]

INF_VERSION = 0x00010005

BASE_NAME = Hqxlib

FILE_GUID = 280E42C3-826E-4573-9772-B74EF11B6D95

MODULE_TYPE = BASE

VERSION_STRING = 1.0

LIBRARY_CLASS = Hqxlib

[Sources]

Hqxlib.c

UefiLibInternal.h

[Packages]

MdePkg/

MdeModulePkg/

[LibraryClasses]

UefiLib

(2).在MdePkgIncludeLibrary中建立.h文件

.h文件中主要是一些宏的定义和函数的声明:

#define SHOWSTRING Print(L"welcome to my world!")

VOID

HqxShowString(

);

(3)在MdePkg文件夹下的的[LibraryClasses]中添加.h文件的地址和库名:

[LibraryClasses]

## @libraryclass Provides a Build my own library

#

Hqxlib|Include/Library/Hqxlib.h

(4)在MdePkg文件夹下的的[LibraryClasses]中添加.inf文件的地址和库名:

[LibraryClasses]

MdePkg/Library/Hqxlib/

2.2 建立好自己的library之后,接下来要做的将自己建立的library绑定到Packages里面:

(1)library所在的Packages的.dec文件的[LibraryClasses]中要包含library的.h文件位置:

[LibraryClasses]

## @libraryclass Provides a Build my own library

#

HqxLib|Include/Library/HqxLib.h

(2) library所在的Packages的.dsc文件的[LibraryClasses]中要包含library的.inf文件位置:

[LibraryClasses]

HqxPkg/Library/HqxLib/

(3) 在文件中的[LibraryClasses]中要包含library的.inf文件位置:

[LibraryClasses]

HqxLib|HqxPkg/Library/HqxLib/

2.3 最后我们要做的就是在自己的Application中调用自己的library:

(1)调用者的.inf要包含调用的Library所在的Package的dec文件

[Packages]

MdePkg/

MdeModulePkg/

#My own library.

HqxPkg/

(2) 调用者的.inf要包含调用的library的Library name:

[LibraryClasses]

UefiApplicationEntryPoint

#My own library.

HqxLib

UefiLib

(3)调用者的.c中要包含调用的Library对应的头文件:

#include

#include

//My own library.

#include

#include 2.4 完成以上步骤,你就成功建立了自己的Application并成功调用了自己建立的library,接下来你只需要编译这个工程文件,把得到的.efi

文件拿去uefi运行,就能得到你想要的效果啦!