Library overview
Lib Overview
Library即通常所说的库, 是一个二进制文件, 一般包含了很多函数的实现和对应的数据在里面, 以供其他人使用
库中所列的一系列函数即库函数, 库函数可供本Package也可跨Package使用, 比较灵活。
Lib的作用:将常用的功能写成函数, 方便他人调用, 无需重复”造轮子”;可以以二进制 (.lib)格式来release, 不需要提供源代码
Lib的文件结构
库一般由三个部分组成:实体、头文件、Dec文件
库的实体:
实体一般由.inf和.c构成,路径:
%WORKSPACE%\xxxPkg\Library\yyyLib\zzz\zzzz.c
xxx: Package name, for example: Mde, MdeModule等
yyy: Library name, for example: Cmos, Debug, Hob等
zzz: Library 子文件夹,可选
zzzz: 库函数所在C文件名
例如:WhiskeyLake\MdePkg\Library\BaseLib\BaseLib.inf
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = BaseLib
MODULE_UNI_FILE = BaseLib.uni
FILE_GUID = 27d67720-ea68-48ae-93da-a3a074c90e30
MODULE_TYPE = BASE
VERSION_STRING = 1.1
LIBRARY_CLASS = BaseLib
含有LIBRARY_CLASS属性, 就是一个库因为它的MODULE_TYPE是BASE类型, 所以可以在任何情况下被使用, 如果非BASE类型, 则还需要在BaseLib后面跟上它可被使用的场景,。
例如:
LIBRARY_CLASS = HobLib|DXE_DRIVER
DXE_RUNTIME_DRIVER DXE_SAL_DRIVER SMM_CORE
DXE_SMM_DRIVER UEFI_APPLICATION
库的头文件:
库函数在头文件中被声明,被调用者Include,这样调用者才能知道库中有哪些函数以及各自具体用法头文件路径如下:
%WORKSPACE%\xxxPkg\Include\Library\yyyLib.h
例如:WhiskeyLake\MdePkg\Include\Library\BaseLib.h
库的Dec文件:
Dec文件:将头文件和库名连接起来
MdePkg.dec
–[LibraryClasses]
----BaseLib|Include/Library/BaseLib.h
库函数的调用:
以BaseLib为例:: MdePkg\Library\BaseLib
1:调用者的.inf要包Library所在的Package的dec文件
[Packages]
MdePkg/MdePkg.dec
2:调用者的.inf要包Library name
[LibraryClasses]
BaseLib
3: 调用者的.c中要包Library对应的头文件
#include <Library/BaseLib.h>
4:调用者的.c中使用库函数
MdePkg 常用Lib
PUBLIC DEFINITIONS
- PI: Common definitions in PI spec
- Uefi: Common definitions in UEFI spec
- Guid: Guid defined in PI/UEFI for Variable/Hob/EventGroup/SystemTable
- Ppi: PPI defined in PI spec
- Protocol: Protocol defined in PI/UEFI spec
- IndustryStandard
- Acpi
- Pci
- Tpm
- Sdram
- Register
- Intel: CPU related registers
- Amd: CPU related registers
BaseLib
String APIs:进行string相关操作,strncpy …
- List APIs:insert remove found ,InsertHeadList、GetFirstNode等
- Math APIs:乘除,左右移,找高低位,HighBitSet32,DivU64x32…
- BitField APIs:操作寄存器,比如32位取哪几位进行与或操作,BitFieldOr64、CaluateSum等
- CPU APIs:CPU pause ,EnableInterrupts , …
- Register Read/Write APIs:大多汇编code,进行常用寄存器的读写Cr0、Dr0、CS 、DS 、Gdtr ,AsmReadCr0…
BASEMEMORYLIB
- CopyMem
- SetMem
- ZeroMem
- CompareMem
- ScanMem
- CopyGuid/ScanGuid/CompareGuid/IsZeroGuid:专门添加的API,用于对编写过程中的Guid进行操作
DEBUGLIB
- gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask:该PCD通过不同的位控制着Lib中下面函数的可执行情况,当全部置零,将不产生任何打印信息
- ASSERT():当条件不成立时候停止
- DEBUG():添加打印信息的类型以及打印内容
- ASSERT_EFI_ERROR()
- DEBUG_CODE_BEGIN()/DEBUG_CODE_END():写一段逻辑运行与打印初期或者结束时候
- DEBUG_CLEAR_MEMORY():将某一段空间清空
REPORTSTATUSCODELIB
- gEfiMdePkgTokenSpaceGuid.PcdReportStatusCodePropertyMask:控制report的类型,除非产品有要求
- REPORT_STATUS_CODE
- REPORT_STATUS_CODE_WITH_DEVICE_PATH
- REPORT_STATUS_CODE_WITH_EXTENDED_DATA
- REPORT_STATUS_CODE_EX
HOBLIB
Hob在PEI Phase 或者说在Memory Ready之前等价于Memory,在只有CAR的阶段需要轻量级的方式管理信息,设计出了HOB,HOB管理方式为从上到下,逐渐叠加
- GetHobList
- GetFirstHob/GetNextHob
- GetFirstGuidHob/GetNextGuidHob
- GET_HOB_TYPE()/GET_HOB_LENGTH()/GET_NEXT_HOB()
- GET_GUID_HOB_DATA()/GET_GUID_HOB_DATA_SIZE()
- BuildGuidHob/BuildGuidDataHob
- BuildFvHob
- BuildResourceDescriptorHob/BuildMemoryAllocationHob
MEMORYALLOCATIONLIB
- AllocatePages\AllocateAlignedPages
- FreePages\FreeAlignedPages
- AllocatePool
- AllocateZeroPool
- AllocateCopyPool
- ReallocatePool
- FreePool
PCDLIB
- PcdGetXX/PcdSetXX: Boolean, UINT8, UINT16, UINT32, UINT64, and VOID*
- FixedPcdGetXX
- PatchPcdGetXX
- PcdGetSize: VOID* PCD type only
- LibPcdGetSku/LibPcdSetSku: Dynamic PCD only
- LibPcdCallbackOnSet/LibPcdCancelCallback: Dynamic PCD only
IOLIB
- IO_LIB_ADDRESS
- IoReadXX/IoWriteXX
- IoOrXX/IoAndXX/IoAndThenOrXX
- IoBitFieldXX
- MmioReadXX/MmioWriteXX
- MmioOrXX/MmioAndXX/MmioAndThenOrXX
- MmioBitFieldXX
- MmioReadBufferXX/MmioWriteBufferXX
PCILIB
- PCI_LIB_ADDRESS
- PciReadXX/PciWriteXX
- PciOrXX/PciAndXX/PciAndThenOrXX
- PciBitFieldXX
- PciReadBuffer/PciWriteBuffer
PEISERVICESTABLEPOINTERLIB
• GetPeiServicesTablePointer()/SetPeiServicesTablePointer()
UEFIBOOTSERVICESTABLELIB
- gST
- gBS
- gImageHandle
DXESERVICESTABLELIB
• gDS
UEFIRUNTIMESERVICESTABLELIB
gRT
SMMSERVICESTABLELIB
- gSmst
- InSmm()
PEIMENTRYPOINT/ UEFIDRIVERENTRYPOINT/UEFIAPPLICATIONENTRYPOINT
- _ModuleEntryPoint
- ProcessLibraryConstructorList
- ProcessModuleEntryPointList
- _DriverUnloadHandler
- ProcessModuleUnloadList
- ProcessLibraryDestructorList
在AutoGen code才会体现出来,在.c不需要使用
常用函数汇总表
库函数 | 作用 | 对应的库名 | 对应的 package | 对应的头文件 |
---|---|---|---|---|
IO相关 | ||||
IoRead8 | 操作IO, 读8位数据 | IoLib | MdePkg.dec | MdePkg\Include\Library\IoLib.h |
IoWrite8 | 操作IO, 写位数据 | IoLib | MdePkg.dec | MdePkg\Include\Library\IoLib.h |
MmioRead8 | 读内存方式获取MMIO 8位数据 | IoLib | MdePkg.dec | MdePkg\Include\Library\IoLib.h |
MmioWrite8 | 写内存方式往MMIO写8位数据 | IoLib | MdePkg.dec | MdePkg\Include\Library\IoLib.h |
String相关 | ||||
StrCpy | Copy string | BaseLib | MdePkg.dec | MdePkg\Include\Library\BaseLib.h |
StrLen | 计算Unicode string长度,每个字符占两个字节大小 | BaseLib | MdePkg.dec | MdePkg\Include\Library\BaseLib.h |
StrSize | 计算所有字符个数,每个字符占位一个字节 | BaseLib | MdePkg.dec | MdePkg\Include\Library\BaseLib.h |
StrCmp | 比较两个字串是否相同 | BaseLib | MdePkg.dec | MdePkg\Include\Library\BaseLib.h |
StrHexToUintn | 取出字符串中0x开头的十六进制数 | BaseLib | MdePkg.dec | MdePkg\Include\Library\BaseLib.h |
Debug相关 | —————————— | |||
打印Unicode string到ConOut设备(屏幕/串口) | UefiLib | MdePkg.dec | MdePkg\Include\Library\UefiLib.h | |
AsciiPrint | 打印Unicode string到ConOut设备(屏幕/串口) | UefiLib | MdePkg.dec | MdePkg\Include\Library\UefiLib.h |
DEBUG | 创建Event | BaseLib | MdePkg.dec | MdePkg\Include\Library\BaseLib.h |
ASSERT | 参数为0时系统Hang,并向ConsoleOut打印Error信息 | BaseLib | MdePkg.dec | MdePkg\Include\Library\BaseLib.h |
MicroSecondDelay | Delay in Micro Level | CpuTimerLib | MdePkg.dec | MdePkg\Include\Library\TimerLib.h |
NanoSecondDelay | Delay in Nano Level | CpuTimerLib | MdePkg.dec | MdePkg\Include\Library\TimerLib.h |
PCD相关 | ||||
PcdGet8 | Get 8位PCD value | PcdLib | MdePkg.dec | MdePkg\Include\LibraryPcdLib.h |
PcdGet8 | Set 8位PCD value | PcdLib | MdePkg.dec | MdePkg\Include\Library\PcdLib.h |
HOB相关 | ||||
GetHobList | 获取HobList | PeiHobLib | MdePkg.dec | MdePkg\Include\Library\HobLib.h |
GetFirstGuidHob | 获取GUID HOB 类型首个HOB | PeiHobLib | MdePkg.dec | MdePkg\Include\Library\HobLib.h |
GetNextGuidHob | 获取GUID HOB 类型下一个HOB | PeiHobLib | MdePkg.dec | MdePkg\Include\Library\HobLib.h |
Memory相关 | ||||
CopyMem | Copies a source buffer to a destination buffer | BaseMemoryLib | MdePkg.dec | MdePkg\Include\Library\BaseMemoryLib.h |
SetMem | 写内存 | BaseMemoryLib | MdePkg.dec | MdePkg\Include\Library\BaseMemoryLib.h |
ZeroMem | 一个buffer的内存全写0 | BaseMemoryLib | MdePkg.dec | MdePkg\Include\Library\BaseMemoryLib.h |
CompareMem | 比较两个buffer数据 | BaseMemoryLib | MdePkg.dec | MdePkg\Include\Library\BaseMemoryLib.h |
CompareGuid | 比较GUID是否相同 | BaseMemoryLib | MdePkg.dec | MdePkg\Include\Library\BaseMemoryLib.h |