UEFI简单程序编写教程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

HelloWorld程序简单编写教程

前言:主要是为了让大家熟悉UEFI程序编写时,三大工程模块的应用及inf文件、dec文件、dsc文件如何配置。以及分享如何在现有的EDK的package中查找我们不熟悉的程序语句。

1.标准应用程序工程模块

本例选择在MdeModulePkg/Application中创建名为Hello的文件

在Hello文件中创建Hello.c文件和Hello.inf文件

C文件

C语言中,程序以main函数作为入口函数。同理,UEFI的标准应用程序工程模块以UefiMain作为程序的入口函数。

应用方式如下:

#include

EFI_STATUS UefiMain(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable) {

SystemTable->ConOut->OutputString(SystemTable->ConOut, L"Helloworld! UEFI\n");

return EFI_SUCCESS;

}

程序解析:

●EFI_STATUS:

入口函数的返回类型是EFI_STATUS,类似C语言中的unsigned long int。

那如何来真正理解程序对它所定义的意思呢?

一般程序对一个名词的定义,要嘛在本程序中,要嘛就是在程序所包含的头文件中,显然,本程序中没有对EFI_STATUS的定义。所以从Uefi.h下手去找。

在EDK文件夹中搜索Uefi.h,只有简单的几行程序,显然这个文件中没有对EFI_STATUS的明确定义。那接着就从下面的两个头文件中查找。

在UefiBaseType.h中查找EFI_STATUS,其中33行代码如下:所以EFI_STATUS 是RETURN_STATUS的别名,那么RETURN_STATUS又是啥?

我们从UefiBaseType.h的所包含的头文件Base.h中查找它的定义,如下:所以从这里可以看出,EFI_STATUS就是一个状态代码.

●IN EFI_HANDLE ImageHandle:

IN表示输入参数

EFI_HANDLE为void类型

ImageHandle

.efi文件加载到内存生成的对象成为Image。ImageHandle是Image对象的句柄,作为模块入口函数的参数

●IN EFI_SYSTEM_TABLE *SystemTable

EFI_SYSTEM_TABLE是一个UEFI内核的全局结构体,定义如下:

SystemTable是程序同UEFI内核交互的桥梁,通过它可以获得UEFI提供的各种服务。

SystemTable->ConOut->OutPutString

从EFI_SYSTEM_TABLE的定义可知,ConOut是结构体的一个成员,其解释如下:

因此,ConOut是指向EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL协议的指针,用于控制台的输出。

在SimpleTextOut.h中可以找到EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL如下定义:

简而言之,这条语句就是通过SystemTable->ConOut->OutPutString服务将字符串Hellloworld!打印到输出设备。

inf文件

inf文件就经常用到的几个块进行解释

●[Defines]

Eg.

[Defines]

INF_VERSION = 0x00010005

BASE_NAME = HelloWorld

FILE_GUID = 6987936E-ED34-44db-AE97-1FA5E4ED2116 MODULE_TYPE = UEFI_APPLICATION

VERSION_STRING = 1.0

ENTRY_POINT = UefiMain

INF_VERSION:INF版本号,通常为0x00010005

BASE_NAME:模块名字字符串,若BASE_NAME为HelloWorld,则最终生成HelloWorld.efi的可执行文件

FILE_GUID:每个工程文件必须有一个8-4-4-4-12是GUID,用于生成固件,一般为6987936E-ED34-44db-AE97-1FA5E4ED2116

VERSION_STRING:模块字符串版本号,一般为1.0,可以不用管

ENTRY_POINT:模块的入口函数,根据C文件定义,如上为UefiMain

●[Sources]

Eg.

[Sources]

HelloWorld.c

为所要编译的C文件的名字,如HelloWorld,c

[Sources]

HelloWorld.c

●[Packages]

Eg.

[Packages]

MdePkg/MdePkg.dec

MdeModulePkg/MdeModulePkg.dec

编译所需要用到的package,一般看程序中有哪些头文件,在EDK的包中搜索此头文件是属于哪个包,就将其列入其中。

本例中的HelloWorld.c是选取在MdeModulePkg中创建编译的,所以需要MdeModulePkg, 而Uefi.h文件是在MdePkg中的,所以需要MdePkg

[LibraryClasses]

Eg.

[LibraryClasses]

UefiApplicationEntryPoint

UefiApplicationEntryPoint是应用工程文件必须链接的库。

为所要链接的库。若在C程序中有Library的库文件:

#include ,则应将UefiLib添加到此块中。(若要用到Print 打印字符串,必须包含UefiLib.h,因为Print定义在其中)

相关文档
最新文档