UEFI简单的应用程序模块MyHelloWorld:C源文件/INF工程文件源码/

/** @file Brief Description of UEFI MyHelloWorld Detailed Description of UEFI MyHelloWorld Copyright for Junhao zhangjunhaolaiwu@163.com License for UEFI MyHelloWorld**//**一般来说,标准应用程序至少要包含以下两个部分。(1)头文件:所有的UEFI程序都要包含头文件Uefi.h。因为Uefi.h定义了UEFI基本数据类型及核心数据结构。(2)入口函数:UEFI标准应用程序的入口函数通常是UefiMain(入口函数可以通过本模块INF文件ENTRY_POINT指定)。UefiMain是一个约定俗成的函数名。虽然入口函数的函数名可以变,但其函数签名(即返回值类型和参数列表)不能变。**/#include <Uefi.h>#include <Library/UefiApplicationEntryPoint.h>#include <Library/UefiLib.h>/** as the real entry point for the application.@param[in] ImageHandle The firmware allocated handle for the EFI image. //.efi文件(UEFI应用程序或者驱动程序)加载到内存后生成的对象称Image。 //ImageHandle是Image对象的句柄,作为模块入口函数参数,表示模块自身加载到内存后生成的Image对象。@param[in] SystemTable A pointer to the EFI System Table. //SystemTable指向UEFI内核一个全局结构体的指针,是程序同UEFI内核交互的桥梁 @retval EFI_SUCCESSThe entry point is executed successfully. //返回值EFI_SUCCESS为预定义常量值为0,表示没有错误的状态值。 @retval otherSome error occurs when executing this entry point. //返回值为非EFI_SUCCESS,即非0值表示执行入口函数时发生了错误Print:向标准输出设备打印字符串是通过库函数Print来实现的。**/EFI_STATUS UefiMain(IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE *SystemTable){Print(L"Hello World from Junhao by EDKII!\n");return EFI_SUCCESS;}## @file# Brief Description of UEFI MyHelloWorld# # Detailed Description of UEFI MyWizardDriver## Copyright for Junhao zhangjunhaolaiwu@163.com# # License for UEFI MyHelloWorld# ###工程文件分为很多块,每个块以"[块名]"开头,"[块名]"必须单独占一行。#[Defines]、[Sources]、[Packages]、[LibraryClasses]是工程文件的必须块。#其他块并不是每个模块一定要编写的块。</span>#[Defines]块用于定义模块的属性和其他变量,块内定义的变量可以被其他块引用。#(1)属性定义语法:属性名 = 属性值#(2)块内属性包括:如下#INF_VERSION:INF标准的版本。EDKII的build会检查INF_VERSION的值并根据这个值解释.inf文件。#最新的INF标准版本号为0x00010006,前半部分为主版本号,后半部分为次版本号。通常设置为0x00010005即可。#INF_VERSION版本号便于EDKII系统升级。#BASE_NAME:模块名字符串,不能包含空格。它通常也是输出文件名字。#例如:BASE_NAME = MyHelloWorld,则最终生成的文件为MyHelloWorld.efi#FILE_GUID:每个工程文件必须有一个8-4-4-4-12格式的GUID,用于生成固件。#可以通过 获得GUID。#MODULE_TYPE:定义模块的模块类型,可以是SEC/PEI_CORE/PEIM/DXE_CORE/DXE_SAL_DRIVER/#DXE_SMM_DRIVER/UEFI_DRIVER/DXE_DRIVER/DXE_RUNTIME_DRIVER/UEFI_APPLICATION/BASE中的一个。#对于标准应用程序工程模块来说,为UEFI_APPLICATION类。#ENTRY_POINT:定义模块函数的入口函数。UefiMain是模块的入口函数就是ENTRY_POINT设定的。[Defines]INF_VERSION= 0x00010005BASE_NAME= MyHelloWorldFILE_GUID= dc72d2c7-a48a-42fd-80b6-9d229d6943c8MODULE_TYPE= UEFI_APPLICATIONVERSION_STRING= 1.0ENTRY_POINT= UefiMain#[Sources]块用于列出模块所有的源文件和资源文件。#(1)语法:块内每行表示一个文件,文件使用相对路径,根路径是工程文件所在的目录。#本示例MyHelloWorld标准应用程序工程模块只含有一个源文件MyHelloWorld.c。#(2)体系结构相关块:[Sources.$(Arch)]#.$(Arch)是可选项,可以是IA32/X64/IPF/EBC/ARM中的一个,表示本模块适用的体系结构。##例如标准应用程序工程的[Sources]如下:##[Sources]#Common.c#[Sources.IA32]#Cpu32.c#[Sources.X64]#Cpu64.c#如果build命令选项中使用了-a IA32选项编译32位模块的时候,工程将包含[Sources]和[Sources.IA32]中的源文件。#如果build命令选项中使用了-a X64 选项编译64位模块的时候,工程将包含[Sources]和[Sources.X64] 中的源文件。##(3)编译工具链相关的源文件#文件名后会有‘|’号,‘|’后面跟工具链的名字,例如:#[Sources]#TimerWin.c | MSFT#TimerLinux.c | GCC#表示TimerWin.c仅在使用Visual Studio编译器时有效,TimerLinux.c仅在使用GCC编译器时有效。[Sources]MyHelloWorld.c#[Packages]块列出本模块引用到的所有的包的包声明文件(.dec)。#(1)语法:每行列出一个文件,,文件使用相对路径,相对路径的根路径为EDKII的根目录。#若[Sources]块内列出了源文件,则在[Packages]块必须列出MdePkg/MdePkg.dec,并将其放在本块首。#本示例MyHelloWorld模块中,MyHelloWorld.c仅仅引用了MdePkg中的头文件Uefi.h,因而仅列出MdePkg/MdePkg.dec即可。[Packages]MdePkg/MdePkg.dec#[LibraryClasses]列出本模块需要链接的库模块。#(1)语法;每一行声明一个要链接的库。#(2)常用库:应用程序工程模块必须链接UefiApplicationEntryPoint库;驱动模块必须链接UefiDriverEntryPoint库。#本示例MyHelloWorld.c中还用到了Print()函数,所以还需要链接UefiLib库。[LibraryClasses]UefiApplicationEntryPointUefiLib#[Protocols]列出本模块使用的Protocol,列出的是Protocol对应的GUID。如果未使用Protocol模块可以为空。[Protocols]#[Ppis]用于定义源文件中用到的PPI(PPI是PEI阶段PEI模块之间通信的接口),语法类似[Protocols]。[Ppis]#[Guids]列出本模块用到的GUID。[Guids]#[BuildOptions]指定本模块的编译和链接选项。[BuildOptions]#Pcd:Platform Configuration Database,平台配置数据库。#[Pcd]用于列出本模块用到的Pcd变量,这些Pcd变量可以被整个UEFI系统访问。[Pcd]#[PcdEx]用于列出本模块用到的Pcd变量,这些Pcd变量可以被整个UEFI系统访问。[PcdEx]#[FixedPcd]用于列出本模块用到的Pcd编译期常量。[FixedPcd]#[FeaturePcd]用于列出本模块用到的Pcd常量。[FeaturePcd]#[PatchPcd]列出的Pcd变量仅本模块可用。[PatchPcd]

版权声明:本文为博主原创文章,未经博主允许不得转载。

我知道按攻略去旅行的人往往玩得过于按步就班,

UEFI简单的应用程序模块MyHelloWorld:C源文件/INF工程文件源码/

相关文章:

你感兴趣的文章:

标签云: