c语言uefi读写文件,UEFI简单的应用程序模块MyHelloWorld:C源文件/INF工程文件源码/简析[6]...

2015-07   北京海淀区张俊浩

->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

#include

#include

/**

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]是工程文件的必须块。

#其他块并不是每个模块一定要编写的块。

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值