UEFI的不同文件
2023-04-15
- 模块(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
列出本模块需要链接的库。模块如果需要添加库,一般需要:- 在INF文件下的
[LibraryClasses]
中添加库名 - 在DES文件的
[LibraryClasses]
中寻找这个库,如果没有,则需要添加编译此库的INF文件。
- 在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]
等几个节组成。
- [Defines]
- [FD]
- Firmware Device 即固件设备,常用的BIOS ROM就是一个FD。
- [FV]
- Fireware Volume FV是固件的逻辑区域,相当于FD上的分区。这个节定义了镜像包含的组件和模块。