UEFI简单程序编写教程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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