Mouble 一个模块,有.inf的文件编译
Package 有0个或许多个Mouble组成,有.dsc和.dec文件
Platform 一个特殊的Package文件一定包含一个.dec文件EDK II 发展史:1、创造了Package用于整合Mouble,作为基础的Mouble的合集,也定义了DEC文件和GUID、Protocols2、由于产生了Package,必须创建INF文件用于规范Mouble的属性和结构。3、创建DSC文件用于编译4、调整Mouble,用于适应于开发出来的体系BuildParsing_Tool:INF\DEC\DSC\Target.txt\Tool_def.txt\FDF-------->Makefile\Auto.c\Auto.h-------->Build(source filde)-------->.EFIEDK II Package
1、包含了许多Mouble和一个DEC
2、提供: MdePkg, MdeModulePkg, etc.基础的包
3、基础包含Include, Library, Application and Drivers.Sample example:Package.decPackage.dscLibrary:NameOnelibNameTwolibInclude:ProtocolsLibraryPpiGuid IndustryStanardApplicationNameOneDxeNameOnePei描述文件:DEC定义了属性,库引用,协议,版本号等
Demo;
[Defines] DEC_SPECIFICATION = 0x00010005 PACKAGE_NAME = PackageNamePACKAGE_GUID = xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx PACKAGE_VERSION = 0.1
[Includes] Include #Package Include directory
[LibraryClasses] ## Library class name is same to library header file name OneClassLib|Include/Library/OneClassLib.h
[Guids] #GuidCName = {xxxxxxxx,xxxx,xxxx,{xx,xx,xx,xx,xx,xx,xx,xx}},
[Ppis] #PpiGuidCName = {xxxxxxxx,xxxx,xxxx,{xx,xx,xx,xx,xx,xx,xx,xx}},
[Protocols] #ProtocolGuidCName = {xxxxxxxx,xxxx,xxxx,{xx,xx,xx,xx,xx,xx,xx,xx}},
[PcdsFeatureFlag] #FeatureFlag PCD is BOOLEAN type, the value is TRUR or FALSE. #PcdTokenSpaceCGuidName.PcdName|TRUE|BOOLEAN|TokenNumber #PcdTokenSpaceCGuidName.PcdName|FALSE|BOOLEAN|TokenNumber
[PcdsFixedAtBuild] #PcdTokenSpaceCGuidName.PcdName|DefaultValue|DataType|TokenNumber
[PcdsPatchableInModule] #PcdTokenSpaceCGuidName.PcdName|DefaultValue|DataType|TokenNumber
[PcdsDynamic] #PcdTokenSpaceCGuidName.PcdName|DefaultValue|DataType|TokenNumber
[PcdsDynamicEx] #PcdTokenSpaceCGuidName.PcdName|DefaultValue|DataType|TokenNumberDSC文件主要是用于编译,但也描述了定义,库等内容Demo:
[Defines] PLATFORM_NAME = PacakgeName PLATFORM_GUID = xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx PLATFORM_VERSION = 0.1 DSC_SPECIFICATION = 0x00010005 OUTPUT_DIRECTORY = Build/PackageName SUPPORTED_ARCHITECTURES = IA32|IPF|X64|EBC BUILD_TARGETS = DEBUG|RELEASE SKUID_IDENTIFIER = DEFAULT
[SkuIds] 0|DEFAULT #The entry: 0|DEFAULT is reserved and required.
[LibraryClasses] ## More library instances need to be added if more library classes are
used ## by the components in the following [Components] section. ## library class name | library instance INF file path from package DebugLib | MdePkg/Library/UefiDebugLibStdErr/UefiDebugLibStdErr.inf BaseLib | MdePkg/Library/BaseLib/BaseLib.inf BaseMemoryLib | MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf …… ##PCDs sections are not specified. ##All PCDs value are from their Default value in DEC.
##[PcdsFeatureFlag]
##[PcdsFixedAtBuild]
[Components] ## All libraries, drivers and applications are added here to be compiled ## Module INF file path are specified from package directory. PackageNamePkg/Library/NameOneLib/NameOneLib.inf PackageNamePkg/NameOneDxe/NameOneDxe.inf PackageNamePkg/NameTwoPei/NameTwoPei.inf 创建Package;1、当需要添加自己创建的Package时,首先需要创建一个符合规范的命名2、创建DEC和DSC文件3、创建目录用于包含所需要的源文件(Include\Library\Dxe\Pei)
Use Package:1、当一个Mouble在创建后,编写时,需要引用Package中一些库,函数时就需要将这个Package添加进来2、每个DSC文件中都包含了该Package所提供的模块,可以通过寻找这些DEC文件获取需要的Mouble.
更新 Package:当源文件改变时,需要更改Package.
更新 Package下的IncludeDEC文件中更新关于Include\LibraryClasses\Protocols\Guids模块的变更选项Demo:
[Includes] Include # Package Include path LocalInclude # Add new include path [Guids] #gGuidCName = {00000000,0000,0000,{00,00,00,00,00,00,00,00}} #updated to gNewGuidCName = {00000000,0000,0000,{00,00,00,00,00,00,00,01}}
[LibraryClasses] #OneClassLib|Include/Library/OneClassLib.inf updated to BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf
[PcdsFixedAtBuild] #Add new FixedAtBuild PCD #PcdTokenSpaceCGuidName.PcdName|DefaultValue|DataType|TokenNumber gEfiMdeModulePkgTokenSpaceGuid.PcdHelloWorldTimes|1|UINT32|0x40000005
重点:当Mouble的INF文件改变和其他一些改变,需要到DSC文件中去修改
Demo:
[Components] #Module INF file path are specified from package directory. #PackageNamePkg/NameTwoPei/NameTwoDxe.inf #updated to MdeModulePkg/Application/HelloWorld/HelloWorld.inf EDK II MoubleMouble:简单来说就是一个具有某种功能的模块,包含了库,协议,源代码等。TYPE:SEC      建立前期的准备,没有标准定义这个模块,但是又有相同规则,都是给PEI准备内存和栈PEI_CORE  被用于PI的专属操作PEIM      被用于PI的专属操作DXE_CORE   被用于PI的专属操作DXE_DRIVER  被用于PI的专属操作,都是在操作系统启动前,在RT之后结束DXE_RUNTIME_DRIVER 在启动操作系统整个过程中,建立虚拟内存映射应用于操作系统DXE_SAL_DRIVER 在物理内存映射之前的物理模式DXE_SMM_DRIVER 在操作系统下一直执行,关于CPU物理内存方面UEFI_DRIVER     在Boot环境下的UEFIUEFI_APPLICATION 在Boot环境下的UEFI的应用创建一个Mouble1、选择或创建一个Mouble位置的Package2、创建一个目录和INF文件3、在INF文件中加入Package的依赖4、在INF中加入PPI,Protocol,Guid,Library5、加入Depex6、创建源代码,并把源代码路径加入到INF中Mouble位置:一般是在Package中,所以首先要确定下Package
选择Package:1、相同应用范围2、相似的操作流程3、同一个类下4、同一平台
创建目录:Library MoublePPI,Protocol,Guid,LibraryClassesApplicationDriver Mouble命名规则:xxxxPei------PEIM, PEI_CORExxxxDxe------DXE_DRIVER, UEFI_DRIVER xxxRuntimeDxe----DXE_RUNTIME_DRIVER xxxDxeSal-------DXE_SAL_DRIVERxxxxLib---------Library Instance
INF的文件需要包含属性,命名等基本信息关于Package的路径和依赖源文件或二进制文件的协议和版本(Protocol\Guid)库(LibraryClasses)其他,属性,编译,Dxe(Application)Demo:
[Defines] INF_VERSION = 0x00010005 BASE_NAME = HelloWorld FILE_GUID = XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX MODULE_TYPE = UEFI_APPLICATION VERSION_STRING = 1.0 UEFI_SPECIFICATION_VERSION = 0x0002001E ENTRY_POINT = UefiMain
#
# The following information is for reference only and not required by the
#build tools.
#
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
#
##
[Sources.common] HelloWorld.c
##
[Packages] MdePkg/MdePkg.dec
##
[LibraryClasses] UefiBootServicesTableLib UefiApplicationEntryPoint UefiLib DebugLib (LibraryClasses)Demo:
[Defines] INF_VERSION = 0x00010005 BASE_NAME = PeiServicesTablePointerLib FILE_GUID = XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX MODULE_TYPE = PEIM VERSION_STRING = 1.0 LIBRARY_CLASS = PeiServicesTablePointerLib|PEIM
PEI_CORE SEC CONSTRUCTOR = PeiServicesTablePointerLibConstructor
#
# VALID_ARCHITECTURES = IA32 X64 IPF EBC (EBC is for build
#only)
#
[Sources.common] PeiServicesTablePointer.c
[Packages] MdePkg/MdePkg.dec
[LibraryClasses] DebugLib创建Package:MdePkg要求所有Mouble都要加加入所在的Package如果涉及其他一些库需要加入库所在的Pkg
创建源文件:1、不同源文件要归入不同的Source2、要在[Source]下表明编译方式3、所以文件不要使用“./”4、所以C文件要在Source下列出
支持的编译工具MSFT 微软编译VSINTEL 英特尔工具GCC   C语言
添加的库在一个平台下支持为其他平台,其他SEC/PEI/DXE提供功能在INF中加入包含Package依赖的库在INF中加入依赖的库 在源代码中包括库的头文件#include <Library/OemHookStatusCodeLib.h> 在[Include]中加入库
添加PCD的关联项目宏和全局变量PCD-Type{FeatureFlag\FixedAtBuild\PatchableInModule\Dynamic}添加Package依赖 **当使用PCD时一定一定要在[Package]下加入PCD所在Package和MdePkg添加PCD到INF
[PCD.common] gEfiMdePkgTokenSpaceGuid.PcdMaximumLinkedListLength gEfiMdePkgTokenSpaceGuid.PcdMaximumAsciiStringLength gEfiMdePkgTokenSpaceGuid.PcdMaximumUnicodeStringLength 创建在C代码中PCD的值在INF中加入依赖PcdLib和MdePkg加入头文件<library/PcdLib.h>使用PCD创建值
PcdGet()/PcdSetx()-----支持所以类型PCD get/set
FeaturePcdGet()/FeaturePcdSet()---FeatureFlag
FixPcdGet() -------FixedAtBuild
PatchPcdGet()/PatchPcdSetx()----PatchPcd如何引用协议、PPI、GUID接口加入到INF文件中[Protocol] gEfiSampleProtocol包含在头文件中
#include <Protocol/DeviceIo.h>
#include <Ppi/Reset.h>
#include <Guid/GlobalVariable.h> 加入依赖[depex] gEfiSampleGuid AND gEfiSamplePpiGuid
创建引用库的步骤INF加入[Defines]LIBRARY_CLASS = UefiDriverEntryPoint|DXE_DRIVER DXE_RUNTIME_DRIVERCONSTRUCTOR = HobLibConstructorDESTRUCTOR = HobLibDestructorType module type of library instance:
BASE module type: EFI_STATUS EFIAPI BaseConstructor ( VOID )
PEIM, PEI_CORE module type: EFI_STATUS EFIAPI PeiServicesTablePointerLibConstructor ( IN EFI_PEI_FILE_HANDLE FileHandle, IN CONST EFI_PEI_SERVICES **PeiServices )
DXE_DRIVER, DXE_CORE, DXE_RUNTIME_DRIVER,
UEFI_APPLICATION, UEFI_DRIVER module type: EFI_STATUS EFIAPI DxeCorePerformanceLibConstructor ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable )
对于Driver:[Defines]ENTRY_POINT = PcdDxeInit
创建VFR文件:
#define FORMSET_GUID { 0x9e0c30bc, 0x3f06, 0x4ba6, 0x82, 0x88, 0x9,
0x17, 0x9b, 0x85, 0x5d, 0xbe }
#define FRONT_PAGE_CLASS 0x0000
#define FRONT_PAGE_SUBCLASS 0x0002
#define FRONT_PAGE_FORM_ID 0x1000
#define FRONT_PAGE_ITEM_ONE 0x0001
#define FRONT_PAGE_ITEM_TWO 0x0002
#define FRONT_PAGE_ITEM_THREE 0x0003
#define FRONT_PAGE_ITEM_FOUR 0x0004
#define FRONT_PAGE_ITEM_FIVE 0x0005
#define FRONT_PAGE_KEY_CONTINUE 0x1000
#define FRONT_PAGE_KEY_LANGUAGE 0x1234
#define FRONT_PAGE_KEY_BOOT_MANAGER 0x1064
#define FRONT_PAGE_KEY_DEVICE_MANAGER 0x8567
#define FRONT_PAGE_KEY_BOOT_MAINTAIN 0x9876
#define LABEL_SELECT_LANGUAGE 0x1000
#define LABEL_TIMEOUT 0x2000
#define LABEL_END 0xffff
formset guid = FORMSET_GUID, title = STRING_TOKEN(STR_FRONT_PAGE_TITLE), help = STRING_TOKEN(STR_NULL_STRING), classguid = EFI_HII_PLATFORM_SETUP_FORMSET_GUID, form formid = FRONT_PAGE_FORM_ID, title = STRING_TOKEN(STR_FRONT_PAGE_TITLE); banner title = STRING_TOKEN(STR_FRONT_PAGE_COMPUTER_MODEL), line 0, align left; banner title = STRING_TOKEN(STR_FRONT_PAGE_CPU_MODEL), line 1, align left;banner title = STRING_TOKEN(STR_FRONT_PAGE_CPU_SPEED), line 1, align right; banner title = STRING_TOKEN(STR_FRONT_PAGE_BIOS_VERSION), line 2, align left; banner title = STRING_TOKEN(STR_FRONT_PAGE_MEMORY_SIZE), line 2, align right; goto FRONT_PAGE_ITEM_ONE, prompt = STRING_TOKEN(STR_CONTINUE_PROMPT), help = STRING_TOKEN(STR_CONTINUE_HELP), flags = INTERACTIVE, key = FRONT_PAGE_KEY_CONTINUE; label LABEL_SELECT_LANGUAGE; // // This is where we will dynamically add a OneOf type op-code to
select // Languages from the currently available choices // label LABEL_END; goto FRONT_PAGE_ITEM_THREE, prompt = STRING_TOKEN(STR_BOOT_MANAGER), help = STRING_TOKEN(STR_BOOT_MANAGER_HELP), flags = INTERACTIVE, key = FRONT_PAGE_KEY_BOOT_MANAGER; goto FRONT_PAGE_ITEM_FOUR, prompt = STRING_TOKEN(STR_DEVICE_MANAGER), help = STRING_TOKEN(STR_DEVICE_MANAGER_HELP), flags = INTERACTIVE, key = FRONT_PAGE_KEY_DEVICE_MANAGER; goto FRONT_PAGE_ITEM_FIVE, prompt = STRING_TOKEN(STR_BOOT_MAINT_MANAGER), help = STRING_TOKEN(STR_BOOT_MAINT_MANAGER_HELP), flags = INTERACTIVE, key = FRONT_PAGE_KEY_BOOT_MAINTAIN; endform;
endformset; 当编译的时候会产生一个.vfr文件来定义IFRUNI文件为字符串输出文件Builde Mouble Fst、把INF加到DSC文件中去。把INF加到DSC[Components]
[Defines] …… SUPPORTED_ARCHITECTURES = IA32|IPF|X64|EBC ……
[Components]
## All libraries, drivers and applications may be added here to be built.
## this library will be built to the IA32, IPF, X64 and EBC arch version. PackageNamePkg/Library/NameOneLib/NameOneLib.inf
[Components.IA32]
## This PEI driver will be built to the IA32 arch version. PackageNamePkg/NameTwoPei/NameTwoPei.inf
[Components.X64, Components.EBC]
## This DXE driver will be built to the X64 and EBC arch version. PackageNamePkg/NameOneDxe/NameOneDxe.inf
Sed、在DSC选择库的依赖
[LibraryClasses]
## Basic Library
BaseLib|MdePkg/Library/BaseLib/BaseLib.inf
DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf
SynchronizationLib|MdePkg/Library/BaseSynchronizationLib/BaseSynchronizat
ionLib.inf
CpuLib|MdePkg/Library/BaseCpuLib/BaseCpuLib.inf
BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf
PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf
PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
## Pci Library
PciCf8Lib|MdePkg/Library/BasePciCf8Lib/BasePciCf8Lib.inf
PciExpressLib|MdePkg/Library/BasePciExpressLib/BasePciExpressLib.inf
PciLib|MdePkg/Library/BasePciLibCf8/BasePciLibCf8.inf
## Entry Point Library
PeimEntryPoint|MdePkg/Library/PeimEntryPoint/PeimEntryPoint.inf
UefiDriverEntryPoint|MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntryP
oint.inf
UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiAp
plicationEntryPoint.inf
## PEI service library
PeiServicesLib|MdePkg/Library/PeiServicesLib/PeiServicesLib.inf
PeiServicesTablePointerLib|MdePkg/Library/PeiServicesTablePointerLib/PeiS
ervicesTablePointerLib.inf
## UEFI and DXE service library
UefiBootServicesTableLib|MdePkg/Library/UefiBootServicesTableLib/UefiBoot
ServicesTableLib.inf
DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTableLi
b.inf
UefiRuntimeServicesTableLib|MdePkg/Library/UefiRuntimeServicesTableLib/Ue
fiRuntimeServicesTableLib.inf
DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf
UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf
UefiLib|MdePkg/Library/UefiLib/UefiLib.inf
DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf
## This library instance should be provide by chipset.
TimerLib|MdePkg/Library/BaseTimerLibNullTemplate/BaseTimerLibNullTemplate
.inf Trd、对于Library Mouble 还要选择PCD的类型,在INF中标识PcdsFeatureFlag,  Bool类型PcdsFixedAtBuild, building时段PcdsPatchableInModule, 修改二进制映像PcdsDynamic.        runtime时段DSC文件中Demo:
[PcdsFeatureFlag]
#PcdName | Pcdvalue
gEfiMdeModulePkgTokenSpaceGuid.PcdHelloWorldPrintEnable|TRUE
[PcdsFixedAtBuild]
#StringPcdName | StringValue| StringType| StringMaxSize
gEfiMdeModulePkgTokenSpaceGuid.PcdHelloWorldPrintString |L"UEFI Hello
World!\n"|VOID*|100
[PcdsPatchableInModule]
#Pring level can be modifed in binary image
gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046
[PcdsDynamicDefault]
#Default print times is 1, its can be modifed in runtime.
gEfiMdeModulePkgTokenSpaceGuid.PcdHelloWorldPrintTimes|0x1
[PcdsDynamicHii]
#time out
#PcdName | Uefi Variable name | Uefi Variable Guid | Offset | Default
value
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdPlatformBootTimeOut|L"Timeou
t"|gEfiGlobalVariableGuid|0x0|5 For、自定义编译选项调整文件tools_def.txt
#
# Build option syntax
# TARGET_TOOLCHAIN_ARCH_COMMANDTYPE_ATTRIBUTE = build option
#
# TARGET is RELEASE or DEBUG
# TOOLCHAIN is tool tag name, MYTOOLS is a tag with VS2005 tool chain
# ARCH is the tool cpu family architecture.
# COMMANDTYPE is the build option name. CC is compile, DLINK is link.
# ATTRIBUTE is FLAGS for the build option.
#
# Debug related options of VS2005 compiler
DEBUG_MYTOOLS_IA32_CC_FLAGS = ... /Zi /Gm
DEBUG_MYTOOLS_IA32_DLINK_FLAGS = ... /DEBUG 修改DSC中声明的Mouble.inf的[BuildOptions]
[BuildOptions]
#
# Tool Chain Family: MSFT, INTEL, GCC for the different compiler tools.
# The different compiler tools have the different compiler options.
# * is not specific TARGET, TOOLTAGNAME, ARCHs.
#
# ‘=’ append the additional option to the tail.
# Append /FAsc compile option only for this module
#
MSFT:*_*_*_CC_FLAGS = /FAsc
#
# ‘==’ replace all options by using new setting
#
MSFT:*_*_*_DLINK_FLAGS == /DEBUG 修改DSC的[BuildOptions]
[BuildOptions]
#
# Append /Od Compile option in DSC to disable optimiaztion for all
modules
#
MSFT:*_*_*_CC_FLAGS = /Od 在DSC中添加额外的[Components]选项
[Components]
#
# Append the debug compile option only to NameOneDxe driver
#
PackageNamePkg/NameOneDxe/NameOneDxe.inf { <BuildOptions> MSFT:*_*_*_CC_FLAGS = /Od }  Fve、建立Mouble映像Build –p Package.dsc –m Module.inf –a ARCH –b TARGET –t TOOLTAG # Build all modules in PackageOne DSC Build –p PackageOne\PackageOne.dsc # Build all modules in PackageTwo DSC Build –p PackageOne\PackageOne.dsc –p PackageTwo\PackageTwo.dsc # Build single module One in PacakgeOne DSC Build –p PackageOne\PackageOne.dsc –m PackageOne\One\One.inf # Build single module Two in PackageOne DSC Build –p PackageOne\PackageOne.dsc –m PackageOne\One\One.inf –m
PackageOne\Two\Two.inf  # Build all modules in PacakgeOne DSC to IA32 arch Build –p PackageOne\PackageOne.dsc –a IA32 # Build all modules in packageOne DSC to IA32 and X64 arch both Build –p PackageOne\PackageOne.dsc –a IA32 –a X64 # Build all modules in PacakgeOne to IA32 arch Build –p PackageOne\PackageOne.dsc –b DEBUG # Build all modules in packageOne to IA32 and X64 arch both Build –p PackageOne\PackageOne.dsc –b DEBUG –b RELEASE # Build all modules in PacakgeOne by MYTOOLS tool chain Build –p PackageOne\PackageOne.dsc –t MYTOOLS # Build all modules in packageOne by MYTOOLS and ICC tool chain Build –p PackageOne\PackageOne.dsc –t MYTOOLS –t ICC
Demo:build HelloWorld
Build –p MdeModulePkg/MdeModulePkg.dsc –m
MdeModulePkg/Application/HelloWorld/HelloWorld.inf –a IA32 –b DEBUG –t
MYTOOLS
HelloWorld.efi will be generated in DEBUG directory:
$(WORKSAPCE)/Build/MdeModulePkg/DEBUG_MYTOOLS/IA32/MdeModulePkg/Applicati
on/HelloWorld/HelloWorld/DEBUG, OUTPUT Six、Build EFI Rom image
[Defines] INF_VERSION = 0x00010005 BASE_NAME = OptionRomOne FILE_GUID = XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX MODULE_TYPE = UEFI_DRIVER ENTRY_POINT = UefiMain
## PCI option for VendorId, DeviceId, ClassCode and Revision
## PCI option is used to create PCI option rom image. PCI_VENDOR_ID = 0x8086 PCI_DEVICE_ID = 0x29c2 PCI_CLASS_CODE = 0x030000 PCI_REVISION = 0x1000
[Sources.common] OptionRom.c
[Packages] MdePkg/MdePkg.dec
[LibraryClasses] UefiBootServicesTableLib UefiDriverEntryPoint UefiLib DebugLib调试Mouble$(WORKSPACE)\Conf\target.txt and change "TARGET = DEBUG" "build -b DEBUG" for debug tip.DSC中选择一个Debug Library选项BaseDebugLibNull, BaseDebugLibSerialPort, UefiDebugLibConOut,
UefiDebugLibStdErr, and PeiDxeDebugLibReportStatusCode. 选择PCD  PcdDebugPropertyMask and PcdDebugPrintErrorLevel.改变 编译选项a developer can use the “/Od” option for the Microsoft* compiler to disable
the optimization of the compiler and avoid disordered instructions. The
debug tip can also use the “/FAsc” option for the Microsoft* compiler to
generate a source and assembly (.cod) file to help debug.UEFI_APPLICATION UEFI的应用 Fst、开始与INF文件MOUBLE_TYPE = UEFI_APPLICATION
Sed、写入口函数
EFI_STATUS
EFIAPI
UefiMain ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable); Trd、获取启动标签 ServicesTablegST gBS  gRT
For、与UEFI驱动通信找寻ProtocolLocateProtocol() HandleProtocol() OpenProtocol()变量读取 GetVariable() and SetVariable()UEFI_DRIVER 驱动程序
Fst、开始与INF文件MODULE_TYPE to UEFI_DRIVER
Sed、写入口函数
EFI_STATUS
EfiLibInstallDriverBinding ( IN CONST EFI_HANDLE ImageHandle, IN CONST EFI_SYSTEM_TABLE *SystemTable, IN EFI_DRIVER_BINDING_PROTOCOL *DriverBinding, IN EFI_HANDLE DriverBindingHandle ); EFI_STATUS
EfiLibInstallAllDriverProtocols2 ( IN CONST EFI_HANDLE ImageHandle, IN CONST EFI_SYSTEM_TABLE *SystemTable, IN EFI_DRIVER_BINDING_PROTOCOL *DriverBinding, IN EFI_HANDLE DriverBindingHandle, IN CONST EFI_COMPONENT_NAME_PROTOCOL *ComponentName, OPTIONAL IN CONST EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2, OPTIONAL IN CONST EFI_DRIVER_CONFIGURATION_PROTOCOL *DriverConfiguration,
OPTIONAL IN CONST EFI_DRIVER_CONFIGURATION2_PROTOCOL *DriverConfiguration2,
OPTIONAL IN CONST EFI_DRIVER_DIAGNOSTICS_PROTOCOL *DriverDiagnostics,
OPTIONAL IN CONST EFI_DRIVER_DIAGNOSTICS2_PROTOCOL *DriverDiagnostics2
OPTIONAL
); 进入Abc驱动
gAbcDriverBindingProtocol
gAbcComponentName
gAbcComponentName2
gAbcDriverDiagnostics EFI_DRIVER_BINDING_PROTOCOL gAbcDriverBinding = { AbcDriverBindingSupported, AbcDriverBindingStart, AbcDriverBindingStop, 0xa, NULL, NULL
}; EFI_COMPONENT_NAME_PROTOCOL gAbcComponentName = { AbcComponentNameGetDriverName, AbcComponentNameGetControllerName, "eng"
}; EFI_COMPONENT_NAME2_PROTOCOL gAbcComponentName2 = { (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) AbcComponentNameGetDriverName, (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)
AbcComponentNameGetControllerName, "en"
};
EFI_DRIVER_DIAGNOSTICS_PROTOCOL gAbcDriverDiagnostics = { AbcDriverDiagnosticsRunDiagnostics, "eng"
};
EFI_DRIVER_DIAGNOSTICS2_PROTOCOL gAbcDriverDiagnostics2 = { (EFI_DRIVER_DIAGNOSTICS2_RUN_DIAGNOSTICS)
gAbcDriverDiagnosticsRunDiagnostics, "en"
};
EFI_STATUS
EFIAPI
AbcDriverEntryPoint ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable )
{ // // Initialize a simple EFI driver that follows the EFI Driver Model // return EfiLibInstallAllDriverProtocols ( ImageHandle, // Driver’s image handle SystemTable, // EFI System Table Pointer &gAbcDriverBinding, // Required parameters ImageHandle, // Handle for driver-related protocols &gAbcComponentName, // Component Name Procol. May be NULL. &gAbcComponentName2, // Component Name2 Procol. May be
NULL. NULL, // Configuration Protocol. May be
NULL. NULL // Configuration Protocol2. May be
NULL. &gAbcDriverDiagnostics, // Diagnostics Protocol. May be NULL. &gAbcDriverDiagnostics2,// Diagnostics Protocol2. May be NULL. );
}
Table:gST gBS  gRT 驱动之间的通信安装Protocol
 InstallProtocolInterface()
 ReInstallProtocolInterface()
 InstallMultipleProtocolInterfaces() 找寻ProtocolLocateProtocol() HandleProtocol() OpenProtocol()SEC MoubleFst、MODULE_TYPE must be set to SEC or USER_DEFINED. INF:
[Defines] ENTRY_POINT = SAMPLE_ENTRY
[BuildOptions] INTEL:*_*_IPF_DLINK_FLAGS = /ENTRY: SAMPLE _ENTRY MSFT:*_*_IPF_DLINK_FLAGS = /ENTRY: SAMPLE _ENTRY GCC:*_*_IPF_PP_FLAGS = --entry _ SAMPLE _ENTRY Sed、建立临时内存环境Trd、准备PEI
typedef
VOID
EFIAPI
(*EFI_PEI_CORE_ENTRY_POINT)( IN CONST EFI_SEC_PEI_HAND_OFF *SecCoreData, IN CONST EFI_PEI_PPI_DESCRIPTOR *PpiList);
EFI_SEC_PEI_HAND_OFF * SecCoreData传递了平台、BFV、临时RAM、栈
SecCoreData->DataSize = sizeof(EFI_SEC_PEI_HAND_OFF); SecCoreData->BootFirmwareVolumeBase = (VOID*)BootFirmwareVolumeBase; SecCoreData->BootFirmwareVolumeSize = PcdWinNtFirmwareFdSize; SecCoreData->TemporaryRamBase = (VOID*)(UINTN)LargestRegion; SecCoreData->TemporaryRamSize = STACK_SIZE; SecCoreData->StackBase = SecCoreData->TemporaryRamBase; SecCoreData->StackSize = PeiStackSize; SecCoreData->PeiTemporaryRamBase = (VOID*) ((UINTN) SecCoreData->TemporaryRamBase + PeiStackSize); SecCoreData->PeiTemporaryRamSize = STACK_SIZE - PeiStackSize; EFI_PEI_PPI_DESCRIPTOR *PpiListTEMPORARY_RAM_SUPPORT_PPI  SEC_PLATFORM_INFORMAITON_PPIPEIMS:MODULE_TYPE = PEIM;
ENTRY_POINT:
EFI_STATUS
EFIAPI PeimSampleInitialize ( IN EFI_PEI_FILE_HANDLE    FileHandle, IN CONST EFI_PEI_SERVICES **PeiServices); 获取PEI GetPeiServicesTablePointer()
通信:HOB \ PPI \ PCD PPI:Install:
//
// Template PPI
//
EFI_PEI_TEMPLATE_PPI gEfiTemplatePpi = { Interface1, Interface2, Interface3
};
EFI_PEI_PPI_DESCRIPTOR gPpiListTemplatePpi = { (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), &gEfiTemplateGuid, &gEfiTemplatePpi
};
EFI_STATUS
PeimEntryPoint ( IN EFI_FFS_FILE_HEADER *FfsHeader, IN EFI_PEI_SERVICES **PeiServices )
{ EFI_STATUS Status; // // Publish Template PPI. // Status = PeiServicesInstallPpi (&gPpiListTemplatePpi); return Status;
} Locating:
// // Get Template PPI // Status = PeiServicesLocatePpi ( &gEfiTemplateGuid, 0, NULL, (VOID **)&TemplatePpi ); ASSERT_EFI_ERROR (Status); // // Invoke Interface2() // Status = TemplatePpi->Interface2 (...); ASSERT_EFI_ERROR (Status); HOB:在DXE Mouble
PCD:DXE 驱动
DXE Mouble通信:HOB \ PPI \PCDHOB:EFI_MEMINIT_CONFIG_DATA *ConfigData; EFI_PEI_HOB_POINTERS Hob; UINTN BufferSize; BufferSize = sizeof (EFI_MEMINIT_CONFIG_DATA); Hob.Raw = BuildGuidHob ( &gEfiMemoryConfigDataGuid, BufferSize ); ASSERT (Hob.Raw); ConfigData = (EFI_MEMINIT_CONFIG_DATA *) Hob.Raw; CopyMem ( ConfigData->SpdData, SpdData, sizeof (MEMINIT_SPD_DATA) * MAX_SOCKETS ); PPI:
#检索Status = PeiServicesLocatePpi ( &gEfiPeiReadOnlyVariable2PpiGuid, 0, NULL, (VOID **) &VariablePpi); ASSERT_EFI_ERROR (Status);
#定义值Size = 0; Status = VariablePpi->GetVariable ( VariablePpi, VariableName, (EFI_GUID *) VariableGuid, NULL, &Size, NULL ); #申请内存if (Status == EFI_BUFFER_TOO_SMALL) { Status = PeiServicesAllocatePool (Size, &Buffer); ASSERT_EFI_ERROR (Status); Status = VariablePpi->GetVariable ( VariablePpi, (UINT16 *) VariableName, (EFI_GUID *) VariableGuid, NULL, &Size, Buffer ); ASSERT_EFI_ERROR (Status);
#获取真实的值*VariableSize = Size; *VariableData = Buffer; } PCD:DXE Driver定义建立BOOT模式:Status = PeiServicesGetBootMode (&BootMode); ASSERT_EFI_ERROR (Status); if (BootMode == BOOT_IN_RECOVERY_MODE) { return EFI_UNSUPPORTED; } Status = PeiServicesInstallPpi (&mPpiListVariable); RegisterForShadow()(查看自己)依赖:[Depex]gEfiPeiReadOnlyVariable2PpiGuid AND gEfiPeiCachePpiGuid AND
gPeiCapsulePpiGuid DXE DRIVER:MOUBLE_TYPE = DXE_DRIVER
[Depex] gSampleProtocolGuidENTRY_POINT:
EFI_STATUS
EFIAPI
WatchdogTimerDriverInitialize( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable )
{ EFI_STATUS Status; // // Make sure the Watchdog Timer Architectural Protocol has not been // installed in the system yet. // ASSERT_PROTOCOL_ALREADY_INSTALLED( NULL, &gEfiWatchdogTimerArchProtocolGuid ); // // Create the timer event to implement a simple watchdog timer // Status = gBS->CreateEvent ( EVT_TIMER | EVT_NOTIFY_SIGNAL, TPL_NOTIFY, WatchdogTimerDriverExpires, NULL, &mWatchdogTimerEvent ); ASSERT_EFI_ERROR (Status); Table:gST gBS  gRT gDS
通信:安装ProtocolInstallProtocolInterface() ReInstallProtocolInterface() InstallMultipleProtocolInterfaces() 找寻ProtocolLocateProtocol()  OpenProtocol()
Demo:
//
// Handle for new protocol instance. Since it’s NULL now, its value will
// be assigned by Boot Service InstallMultipleProtocolInterfaces()
//
EFI_HANDLE mNewHandle = NULL;
//
// The Sample Protocol instance produced by this driver
//
EFI_SAMPLE_PROTOCOL mSampleProtocol = { SampleProtocolApi // // More APIs can be added here //
};
//
// This is just a NULL function with no parameters. Necessary parameters
// and code can be added.
//
EFI_STATUS
EFIAPI
SampleProtocolApi( VOID )
{ return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
SampleDriverInitialize ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable )
{ EFI_STATUS Status; // // More initialization can be added here. // // // Install the Sample Protocol onto a new handle // Status = gBS->InstallMultipleProtocolInterfaces ( &mNewHandle, &gEfiSampleProtocolGuid, &mSampleProtocol, NULL ); ASSERT_EFI_ERROR (Status); return EFI_SUCCESS;
}
#引用API
EFI_STATUS
SampleFunction ( VOID )
{ EFI_STATUS Status; EFI_SAMPLE_PROTOCOL *SampleProtocol; // // Locates the Sample Protocol from system. // Status = gBS->LocateProtocol ( &gEfiSampleProtocolGuid, NULL, (VOID **) &SampleProtocol ); if (EFI_ERROR (Status)) { return Status; } Status = SampleProtocol->SampleProtocolApi(); return Status;
} #读写变量示例
EFI_STATUS
ReadAndWriteVariable ( IN CHAR16 *Name, IN EFI_GUID *VendorGuid, )
{ EFI_STATUS Status; UINTN BufferSize; VOID *Buffer; Buffer = NULL; // // Pass in a zero-size buffer to find the required buffer size. // BufferSize = 0; Status = gRT->GetVariable (Name, VendorGuid, NULL, &BufferSize,
Buffer); // // If variable exists, the Status should be EFI_BUFFER_TOO_SMALL and // BufferSize has been updated. // if (Status != EFI_BUFFER_TOO_SMALL) { return Status; } // // Allocate the buffer according to updated BufferSize. // Buffer = AllocateZeroPool (BufferSize); ASSERT (Buffer != NULL); // // Read variable into the allocated buffer. // Status = gRT->GetVariable (Name, VendorGuid, NULL, &BufferSize,
Buffer); if (EFI_ERROR (Status)) { BufferSize = 0; } // // TODO: Process of retrieved variable can be added here. // // // Now write back the processed variable. // Status = gRT->SetVariable ( Name,
VendorGuid, EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE, BufferSize,
Buffer ); ASSERT_EFI_ERROR (Status); 与PEIM通信:HOB\variable\PCD
HOB:
#HOB的所以种类EFI_HOB_GENERIC_HEADER *Hob; UINT16 HobType; UINT16 HobLength; for(Hob = GetHobList();!END_OF_HOB_LIST(Hob);Hob = GET_NEXT_HOB(Hob)) { HobType = GET_HOB_TYPE (Hob); HobLength = GET_HOB_LENGTH (Hob); // // Further operation on the HOB can be added // }
#获取第一个HOBEFI_HOB_CPU *CpuHob; CpuHob = GetFirstHob (EFI_HOB_TYPE_CPU); if (CpuHob != NULL) { // // Operation on the HOB can be added here. //}
#获取全部HOB
EFI_HOB_CPU *Hob; Hob = GetHobList (); while ((Hob = GetNextHob (EFI_HOB_TYPE_CPU, Hob)) != NULL) { // // Operation on the HOB can be added here. // // At the end of loop, GET_NEXT_HOB must be added here. // GetNextHob(HobType, HobStart) does not skip the HOB passed by // parameter HobStart. It returns HobStart back if HobStart itself // meets the requirement. So it is required to use GET_NEXT_HOB() to // skip current HOB. Otherwise, it would be in dead loop. // Hob = GET_NEXT_HOB (Hob); } #第一个HOB的GUIDEFI_HOB_GENERIC_HEADER *Hob; VOID *HobData; UINTN HobDataSize; Hob = GetFirstGuidHob (&gAbcGuid); if (Hob != NULL) { HobData = GET_GUID_HOB_DATA (Hob); HobDataSize = GET_GUID_HOB_DATA_SIZE (Hob); // // Operation on the HOB can be added here. // } #全部GUIDEFI_HOB_GENERIC_HEADER *Hob; VOID *HobData; UINTN HobDataSize; Hob = GetHobList (); while ((Hob = GetNextGuidHob (&gAbcGuid, Hob)) != NULL) { HobData = GET_GUID_HOB_DATA (Hob); HobDataSize = GET_GUID_HOB_DATA_SIZE (Hob); // // Operation on the HOB can be added here. // // At the end of loop, GET_NEXT_HOB must be added here. // GetNextHob(HobType, HobStart) does not skip the HOB passed by // parameter HobStart. It returns HobStart back if HobStart itself // meets the requirement. So it is required to use GET_NEXT_HOB() to // skip current HOB. Otherwise, it would be in dead loop. // Hob = GET_NEXT_HOB (Hob); } Variable:PEIM 可以读取 DXE的值
依赖:
[Depex]
gEfiSimpleTextOutProtocolGuid AND
gEfiHiiDatabaseProtocolGuid AND
gEfiVariableArchProtocolGuid AND
gEfiVariableWriteArchProtocolGuid 操作 EVT_SIGNAL_EXIT_BOOT_SERVICES:
VOID
EFIAPI
NotifyExitBootServices ( IN EFI_EVENT Event, IN VOID *Context
)
{ // // Put driver-specific actions here. // No UEFI Memory Service may be used directly or indirectly. //
}
EFI_STATUS
EFIAPI
SampleDriverInitialize ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
{ EFI_STATUS Status; EFI_EVENT ExitBootServicesEvent; // // TODO: Other initialization of entry point can be added here. // // // Here is just the sample of registration of // EVT_SIGNAL_EXIT_BOOT_SERVICES // Status = gBS->CreateEventEx ( EVT_NOTIFY_SIGNAL, TPL_CALLBACK, NotifyExitBootServices, NULL, // Parameter Context can be passed here &gEfiEventExitBootServicesGuid, &ExitBootServicesEvent ); ASSERT_EFI_STATUS (Status);
}
DXE Runtime:
MODULE_TYPE as DXE_RUNTIME_DRIVER
SetVirtualAddressMap() INF文件:[Defines] INF_VERSION = 0x00010005 BASE_NAME = SampleDriverRuntimeDxe FILE_GUID = XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX MODULE_TYPE = DXE_RUNTIME_DRIVER ENTRY_POINT = SampleRuntimeDriverEntryPoint [Depex] gSampleProtocolGuid 操作EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE;
//
// This is the global pointer which needs converting
//
VOID *gGlobalPointer;
VOID
EFIAPI
NotifySetVirtualAddressMap (
IN EFI_EVENT Event,
IN VOID *Context
)
{ gRT->ConvertPointer ( EFI_OPTIONAL_POINTER, (VOID **)&gGlobalPointer );
}
EFI_STATUS
EFIAPI
SampleRuntimeDriverInitialize ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
{ EFI_STATUS Status; EFI_EVENT SetVirtualAddressMapEvent; // // TODO: Other initialization of entry point can be added here. // // // Here is just the sample of registration of // EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE // Status = gBS->CreateEventEx ( EVT_NOTIFY_SIGNAL, TPL_CALLBACK, NotifySetVirtualAddressMap, NULL, // Parameter Context can be passed here &gEfiEventVirtualAddressChangeGuid, &SetVirtualAddressMapEvent ); ASSERT_EFI_STATUS (Status);
} DXE SAL :[Defines] INF_VERSION = 0x00010005 BASE_NAME = SampleDriverDxeSal FILE_GUID = XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX MODULE_TYPE = DXE_SAL_DRIVER ENTRY_POINT = SampleDxeSalDriverEntryPoint
[Depex] gSampleProtocolGuid ENTRY_POINT:EFI_STATUS
EFIAPI
SampleDxeSalDriverEntryPoint ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable )
{ // // More initialization can be added here. // // // Event creation for EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE can be added // here. // // // Register SAL services // return EFI_SUCCESS;
} DXE SMM :MODULE_TYPE = DXE_SMM_DRIVER.PCD TYPE:PcdGetxx(PcdSampleDynamicPcd);#没有包括进的PCDPcdGetxxEx(gEfiMyTokenspaceGuid, PcdSampleDynamicPcd)DSC文件规定使用

UEFI Build file相关推荐

  1. FAILURE: Build failed with an exception. * Where: Build file ‘D:\ProgramData\AndroidStudioProjects\ѧ

    错误: FAILURE: Build failed with an exception. * Where: Build file 'D:\ProgramData\AndroidStudioProjec ...

  2. 使用idea误点 Add as Ant Build File选项后

    使用idea对pom.xml误点 Add as Ant Build File选项后 还原method: 1. 2.

  3. app build file记录

    apply plugin: 'com.android.application' apply plugin: 'com.jakewharton.butterknife' android {compile ...

  4. Build file: no target in no project

    需要在项目中编译执行目标文件才有效. 原文参考自:http://forums.codeblocks.org/index.php?topic=20579.0

  5. codeblocks||=== Build file: no target in no project (compiler: unknown) ===

    codeblocks 新建c++文件出现编译错误: 是因为要按照新建项目的方式,而不是 新建文件. 在main.cpp中做更改

  6. UEFI sec阶段的实现

    本文的实现是在MIPS平台龙芯架构实现的,在其他平台上实现方式可能不一样,但是大体上都是相同的. 首先Sec阶段是UEFI最早的一个阶段,CPU上电后从固定地址取指开始执行.每种架构的CPU上电后第一 ...

  7. 一个build.xml实例

    <?xml version="1.0"?> <project name="ssh" basedir="." default ...

  8. build.xml(黎活明安全管理部署文件)

    <?xml version="1.0"?> <!-- ====================================================== ...

  9. The SDK Build Tools revision (23.0.3) is too low for project ':app'. Minimum required is 25.0.0

    参考:http://stackoverflow.com/questions/41890659/errorthe-sdk-build-tools-revision-23-0-3-is-too-low-f ...

最新文章

  1. java中各种vo举例_了解JAVA中的POJO,Entity,PO,VO,DTO,DM包括代码举例展示
  2. yii2 后台权限验证获取用户身份_前、后端分离权限控制设计与实现
  3. MySQL中的组函数(聚合函数)
  4. 百练OJ:4150:上机
  5. C++ 外部函数通过指针修改类成员的值
  6. 关联规则 java_Java实现的关联规则算法
  7. jvm gc垃圾回收机制和参数说明amp;amp;Java JVM 垃圾回收(GC 在什么时候,对什么东西,做了什么事情)
  8. CEF3—在网页加载前给js对象填值
  9. React hooks + antd前台实现input搜索框实时搜索table表格
  10. RabbitMQ(五) 订阅发布者模式介绍以及代码实现
  11. 抖音用计算机弹曲子,抖音计算机乐谱有哪些?抖音计算机乐谱大全分享
  12. 比尔盖茨:有种事你永远不能等待!
  13. Linux常用正则表达式
  14. Codechef QGRID
  15. 博文视点在SD2.0大会上以书会友
  16. python替换word中字符串_python:替换/替换字符串中的所有wholeword匹配
  17. 智伴机器人班尼_班尼机器人说明书
  18. 目标客户画像_如何定义目标客户和用户画像
  19. python: 百度地图api爬虫
  20. Base64 erlang

热门文章

  1. 小提琴统计图_超级详细的小提琴结构图
  2. 基于TypeScript + WebGL 游戏引擎 笔记
  3. FOC——5.6.7.BUCK电路分析
  4. nginx提升网站访问速度
  5. html验证码360问答,验证码源代码实现 c#
  6. 如何防止无线网络被蹭 WiFi安全小秘籍
  7. 情人节,用C++画一个心:)
  8. Vue2学习笔记(尚硅谷张天禹老师)Day-03
  9. GUP使用率查看命令
  10. Node.js+Mongoose实现MondoDB操作