高通QCS平台UEFI爬坑之旅二:UEFI工程文件

高通QCS平台UEFI爬坑之旅二:UEFI工程文件

参考:UEFI原理与编程

  • 我们大概弄明白UEFI与BIOS的区别以及UEFI的启动阶段,接下来我们需要在这段“坑旅”往前一步了。在我们写代码前,我们再来了解一下如果我们自己写一个UEFI的工程需要什么。好的,上硬菜!

硬 菜:

首先我们先理解一下两个概念:模块(Module)、包(Package)。
我们可以在BOOT.XF.0.1/boot_images/ 目录下看到有很多以*Pkg命名的文件夹,每一个这样的文件夹称为一个Package,其实这样的理解不太准确,应该说,“包”是一组模块及平台描述文件(.dsc文件)、包声明文件(.dec文件)组成的集合。模块是UEFI系统的一个特色。模块(可执行文件.efi文件)
像插件一样可以动态地加载到UEFI内核中。而每个工程模块由元数据文件(.inf文件)和源文件组成。

UEFI模块
模块类型相应说明
标准应用程序工程模块在DXE阶段运行的应用程序(Shell环境下也可以运行)
ShellAppMain应用程序工程模块Shell环境下运行的应用程序
main应用程序工程模块Shell环境下运行的应用程序,并且应用程序链接了StdLib库
UEFI驱动模块符合UEFI驱动模块模型的驱动,仅在BS期间有效
库模块作为静态库被其他模块调用
DXE驱动模块DXE环境下运行的驱动,此类驱动不遵循UEFI驱动模型
DXE运行时驱动模块进入运行期仍然有效的驱动
DXE SAL驱动模块仅对安腾CPU有效的一种驱动
DXE SMM驱动模块系统管理模式驱动,模块被加载到系统管理内存区。系统进入运行期该驱动仍然有效
PEIM模块PEI阶段的模块
SEC模块固件的SEC阶段
PEI_CORE模块固件的PEI阶段
DXE_CORE模块固件的DXE阶段
标准应用程序工程模块
标准应用程序工程模块是其他应用程序工程模块的基础,也是UEFI中常见的一种应用程序工程模块。每个工程模块由两个部分组成:工程文件与源文件。所以,一个简单的标准应用程序工程模块包括一个C程序源文件(如Main.c)以及一个工程文件(如Main.inf)。
工程文件
想要编译你的自己的Main.c就需要编写相应的.inf(Module Information File)文件,是模块的工程文件。工程文件分为很多的块:
必需块块描述
[Defines]定义本模块的属性变量及其他变量,这些变量可在工程文件其他块中应用
[Sources]列出本模块的所有源文件及资源文件
[Packages]列出本模块引用到的所有包的声明文件。可能引用到的资源包括头文件、GUID、Protocal等,这些资源都声明在包的包声明文件.dec中
[LibraryClasses]列出本模块要链接的库模块
非必需块块描述
[Protocols]列出本模块用到的Protocol
[Guids]列出本模块用到的GUID
[BuildOptions]指定编译和链接选项
[Pcd]Pcd全称为平台配置数据库(Platform Configuration Database)。用于列出本模块用到的Pcd变量,这些Pcd变量可被整个UEFI系统访问
[PcdEx]用于列出本模块用到的Pcd变量,这些Pcd变量可被整个UEFI系统访问
[FixedPcd]用于列出本模块用到的Pcd编译期常量
[FeaturePcd]用于列出本模块用到的Pcd常量
[PatchPcd]列出的Pcd变量仅本模块可用

接下来,我们讲述一下必需块的用法:

  • [Defines]
    块内必须定义的属性包括:
    • INF_VERSION:INF标准的版本号,通常将INF_VERSION设置为0x00010005即可。
    • BASE_NAME:模块名字字符串,不能有空格。如果Base_Name是UefiMain,则最终生成的文件为UefiMain.efi。
    • FILE_GUID:每个工程文件必须有一个8-4-4-4-12格式的GUID,用于生成固件。
    • VERSION_STRING:模块的版本号字符串。例如:VERSION_STRING=1.0。
    • MODULE_TYPE:定义模块的模块类型,可以是SEC、PEI_CORE、PEIM、DXE_CORE、DXE_SAL_DRIVER、DXE_SMM_DRIVER、UEFI_DRIVER、DXE_DRIVER、DXE_RUNTIME_DRIVER、UEFI_APPLICATION、BASE中的一个。
    • ENTRY_POINT:定义模块的入口函数。
    Example:
    [Defines]
       INF_VERSION = 0x00010005
       BASE_NAME = UefiMain
       FILE_GUID = 90A49AFD-42C3-08AE-9611-368652008636
       MODULE_TYPE = UEFI_APPLICATION
       VERSION_STRING = 1.0
       ENTRY_POINT = Main
  • [Sources]
    [Sources]用于列出模块的所有源文件和资源文件。
    • [Sources.$(Arch)]
      .$(Arch)是可选项,可以是IA32、X64、IPF、EBC、ARM中的一个,表示本模块适用的体系结构。[Sources]块适用与任何体系结构。
    • Example:
      [Sources]
         main.c
  • [Packages]
    [Packages]列出本模块引用到的所有包的包声明文件(.dec文件)。
    • [Packages]块内每一行列出一个文件,文件使用相对路径,相对路径的根路径为EDK2的根目录。若[Sources]块内列出了源文件,则在[Packages]块必须列出MdePkg/MdePkg.dec,并将其放在本块的首行。
    • Example:
      [Packages]
         MdePkg/MdePkg.dec
  • [LibraryClasses]
    [LibraryClasses]列出本模块要链接的库模块。
    • [LibraryClasses]块内每一行声明一个要链接的库
    • 常用库:应用程序工程模块必须链接UefiApplicationEntryPoint库;驱动模块必须链接UefiDriverEntryPoint库。
    • Example:
      [LibraryClasses]
         UefiApplicationEntryPoint

以上的知识是对UEFI工程文件的简单描述分析,算是编程前的准备吧,毕竟有所理解才能更好地去编写代码嘛,下一篇将开始带大家了解一下高通定制的UEFI。希望大伙们多多支持。
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值