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

UEFI简单的应用程序模块MyHelloWorldC源文件/INF工程文件源码/简析[6]

2015-07   北京海淀区  张俊浩 

6. UEFI简单的应用程序模块MyHelloWorldC源文件//INF工程文件源码/简析

      ->6.1 MyHelloWorld.c源程序/简析

      ->6.2 MyHelloWorld.inf源程序/简析

6.1 MyHelloWorld.c源程序/简析

/** @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_SUCCESS       The entry point is executed successfully.
  //返回值EFI_SUCCESS为预定义常量值为0,表示没有错误的状态值。
  @retval other             Some 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;
}

6.2 MyHelloWorld.inf源程序/简析

## @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,用于生成固件。
#可以通过 http://www.guidgen.com/获得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             = 0x00010005
	BASE_NAME               = MyHelloWorld
	FILE_GUID               = dc72d2c7-a48a-42fd-80b6-9d229d6943c8
	MODULE_TYPE             = UEFI_APPLICATION
	VERSION_STRING          = 1.0
	ENTRY_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]
	UefiApplicationEntryPoint
	UefiLib

#[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]

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值