BIOS知识枝桠—— Library

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位数据IoLibMdePkg.decMdePkg\Include\Library\IoLib.h
IoWrite8操作IO, 写位数据IoLibMdePkg.decMdePkg\Include\Library\IoLib.h
MmioRead8读内存方式获取MMIO 8位数据IoLibMdePkg.decMdePkg\Include\Library\IoLib.h
MmioWrite8写内存方式往MMIO写8位数据IoLibMdePkg.decMdePkg\Include\Library\IoLib.h
String相关
StrCpyCopy stringBaseLibMdePkg.decMdePkg\Include\Library\BaseLib.h
StrLen计算Unicode string长度,每个字符占两个字节大小BaseLibMdePkg.decMdePkg\Include\Library\BaseLib.h
StrSize计算所有字符个数,每个字符占位一个字节BaseLibMdePkg.decMdePkg\Include\Library\BaseLib.h
StrCmp比较两个字串是否相同BaseLibMdePkg.decMdePkg\Include\Library\BaseLib.h
StrHexToUintn取出字符串中0x开头的十六进制数BaseLibMdePkg.decMdePkg\Include\Library\BaseLib.h
Debug相关——————————
Print打印Unicode string到ConOut设备(屏幕/串口)UefiLibMdePkg.decMdePkg\Include\Library\UefiLib.h
AsciiPrint打印Unicode string到ConOut设备(屏幕/串口)UefiLibMdePkg.decMdePkg\Include\Library\UefiLib.h
DEBUG创建EventBaseLibMdePkg.decMdePkg\Include\Library\BaseLib.h
ASSERT参数为0时系统Hang,并向ConsoleOut打印Error信息BaseLibMdePkg.decMdePkg\Include\Library\BaseLib.h
MicroSecondDelayDelay in Micro LevelCpuTimerLibMdePkg.decMdePkg\Include\Library\TimerLib.h
NanoSecondDelayDelay in Nano LevelCpuTimerLibMdePkg.decMdePkg\Include\Library\TimerLib.h
PCD相关
PcdGet8Get 8位PCD valuePcdLibMdePkg.decMdePkg\Include\LibraryPcdLib.h
PcdGet8Set 8位PCD valuePcdLibMdePkg.decMdePkg\Include\Library\PcdLib.h
HOB相关
GetHobList获取HobListPeiHobLibMdePkg.decMdePkg\Include\Library\HobLib.h
GetFirstGuidHob获取GUID HOB 类型首个HOBPeiHobLibMdePkg.decMdePkg\Include\Library\HobLib.h
GetNextGuidHob获取GUID HOB 类型下一个HOBPeiHobLibMdePkg.decMdePkg\Include\Library\HobLib.h
Memory相关
CopyMemCopies a source buffer to a destination bufferBaseMemoryLibMdePkg.decMdePkg\Include\Library\BaseMemoryLib.h
SetMem写内存BaseMemoryLibMdePkg.decMdePkg\Include\Library\BaseMemoryLib.h
ZeroMem一个buffer的内存全写0BaseMemoryLibMdePkg.decMdePkg\Include\Library\BaseMemoryLib.h
CompareMem比较两个buffer数据BaseMemoryLibMdePkg.decMdePkg\Include\Library\BaseMemoryLib.h
CompareGuid比较GUID是否相同BaseMemoryLibMdePkg.decMdePkg\Include\Library\BaseMemoryLib.h
  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值