UEFI的不同文件

UEFI的不同文件

2023-04-15
bios
  • 模块(module)是UEFI上最小的可单独编译的代码单元,它包含INF文件,源代码和二进制文件。INF文件用来描述文件的行为。
  • 包(package)是由模块、平台描述文件(DSC)和包声明文件(DEC)组成,可以不包含模块,也可以包含多个模块。
  • EDK2中定义了很多类型的模块:
    类型 说明
    BASE 常用于库模块的开发
    SEC
    PEI_CORE
    DXE_CORE
    DXE_DRIVER
    DXE_RUNTIME_DRIVER
    DXE_SAL_DRIVER
    DXE_SMM_DRIVER
    UEFI_DRIVER UEFI启动模块
    UEFI_APPLICATION UEFI应用模块

搭建UEFI工程模块 #

  • UEFI编译过程如下:

DSC文件 #

  • dsc文件(description)是平台描述文件,描述了模块、库和组件如何编译。文件中还包含很多的节标志如[Defines]
  • 在dsc文件中,经常用!include来包含其他文件,用#来表示注释。
  • [Defines]中定义了各种变量,必须是dsc文件中的第一个。语法格式如下:
[Defines]
  PLATFORM_NAME                  = MdeModule
  PLATFORM_GUID                  = 587CE499-6CBE-43cd-94E2-186218569478
  PLATFORM_VERSION               = 0.98
  DSC_SPECIFICATION              = 0x00010005
  #可选
  OUTPUT_DIRECTORY               = Build/MdeModule
  SUPPORTED_ARCHITECTURES        = IA32|X64|EBC|ARM|AARCH64|RISCV64|LOONGARCH64
  BUILD_TARGETS                  = DEBUG|RELEASE|NOOPT
  SKUID_IDENTIFIER               = DEFAULT
  • [BuildOptions]中给出编译器和相关的编译参数。

  • [LibraryClasses]用来提供模块所使用的库入口,格式如下:

[LibraryClasses]
  PeiCoreEntryPoint|MdePkg/Library/PeiCoreEntryPoint/PeiCoreEntryPoint.inf
  PeimEntryPoint|MdePkg/Library/PeimEntryPoint/PeimEntryPoint.inf
  • [Components]用来定义模块编译,指定模块的INF文件所在的位置。格式如下:
[Components]
  MdeModulePkg/Application/HelloWorld/HelloWorld.inf
  MdeModulePkg/Application/DumpDynPcd/DumpDynPcd.inf
  
  #这种格式下,{}内的内容只对当前的INF文件有效
  AppPkg/Applications/LibSample/MyLibApp/MyLibApp.inf{
    <LibraryClasses>
    MyLibraryLib|AppPkg/Applications/LibSample/MyLibrary/MyLibrary.inf
  }

INF文件 #

  • inf文件是模块的工程文件,描述了模块的属性,如模块由哪些代码组成、依赖了哪些库等。

  • EDK2的模块一般位于包的子目录下,如果是提供库的模块一般位于Library子目录下,如果是UEFI Application,一般位于Application下。

  • INF文件包含很多节标志,包括[Defines][Sources]等。

  • [Defines]中定义了各种变量,后续编译步骤中需要使用这些变量。

[Defines]
  INF_VERSION                    = 0x00010005
  BASE_NAME                      = Uefi_Main
  FILE_GUID                      = 6937936E-ED34-44ab-AE97-1FA5E7ED2116
  MODULE_TYPE                    = UEFI_APPLICATION
  VERSION_STRING                 = 1.0
  ENTRY_POINT                    = UefiMain
  • [Sources]用于列出模块中所有的源文件和资源文件,这些文件位于inf所在的目录或者子目录中。
[Sources]
  Uefi_Main.c
  • [BuildOptions]和dsc文件的[BuildOptions]语法格式基本相同,INF文件只对本模块有效,DSC对包下所有模块有效。
  • [Protocols]列出了模块时用到的协议,在INF文件中列出的是协议的GUID。
[Protocols]
  gEfiSimpleTextInputExProtocolGuid
  gEfiGraphicsOutputProtocolGuid
  • LibraryClasses列出本模块需要链接的库。模块如果需要添加库,一般需要:
    1. 在INF文件下的[LibraryClasses]中添加库名
    2. 在DES文件的[LibraryClasses]中寻找这个库,如果没有,则需要添加编译此库的INF文件。
[LibraryClasses]
  UefiLib
  ShellCEntryLib
  • [Packages]列出本模块引用的所有包的DEC文件。
[Packages]
  MdePkg/MdePkg.dec
  ShellPkg/ShellPkg.dec

3种入口函数的UEFI应用 #

  • <Uefi.h> 定义了UEFI中的基本数据类型和核心数据结构。

  • <Library/UefiLib.h>提供通用的库函数。

  • <Library/BaseLib.h>提供字符串处理、数学、文件路径处理等相关库函数。

  • <Library/BaseMemoryLib.h> 处理内存的库函数。

  • <Library/DebugLib.h>功能调试输出的库函数。

  • ImageHandle指向了模块自身加载到内存的Image对象。SystemTable是UEFI应用和UEFI内核交互的桥梁,通过它可以获得UEFI提供的各种服务,包括BS服务和CS服务。

  • 在EFI_SYSTEM_TABLE的结构体中,提供了访问BS服务和RT服务的指针。针对一些常用的Protocol的接口,如ConsoleIn(键盘)和ConsoleOut(屏幕)也提供了访问指针。

FDF文件 #

  • Flash Description File FDF文件用来描述固件在Flash中的布局和位置。
  • 一般来说,生成固件的源码中只有一个FDF文件,其作用是规定把哪些包编入Flash中,并确定编译的位置。
  • FDF文件由[Defines] [FD] [FV] [Capsule] [VTF] [Rule] [OptionRom]等几个节组成。
  1. [Defines]
  2. [FD]
    • Firmware Device 即固件设备,常用的BIOS ROM就是一个FD。
  3. [FV]
    • Fireware Volume FV是固件的逻辑区域,相当于FD上的分区。这个节定义了镜像包含的组件和模块。