马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
前置步调:
- 准备UEFI实验环境教程:搭建edk2编译环境
- UEFI官方技术参考手册
HOB(Hand-Off Block)是一个通用的布局体类型:MdePkg/Include/Pi/PiHob.h
- ///
- /// Describes the format and size of the data inside the HOB.
- /// All HOBs must contain this generic HOB header.
- ///
- typedef struct {
- ///
- /// Identifies the HOB data structure type.
- ///
- UINT16 HobType;
- ///
- /// The length in bytes of the HOB.
- ///
- UINT16 HobLength;
- ///
- /// This field must always be set to zero.
- ///
- UINT32 Reserved;
- } EFI_HOB_GENERIC_HEADER;
复制代码 EFI_HOB_GENERIC_HEADER是所有HOB布局的通用头部,它包罗了HOB的类型、长度以及指向下一个HOB的指针
除了通用头部,具体的HOB数据布局根据HobType的差别会有差别的定义
EFI_HOB_HANDOFF_INFO_TABLE
用于描述HOB列表的起始信息,通常是第一个HOB,用于传递PEI到DXE的过渡信息:MdePkg/Include/Pi/PiHob.h
- ///
- /// Contains general state information used by the HOB producer phase.
- /// This HOB must be the first one in the HOB list.
- ///
- typedef struct {
- ///
- /// The HOB generic header. Header.HobType = EFI_HOB_TYPE_HANDOFF.
- ///
- EFI_HOB_GENERIC_HEADER Header;
- ///
- /// The version number pertaining to the PHIT HOB definition.
- /// This value is four bytes in length to provide an 8-byte aligned entry
- /// when it is combined with the 4-byte BootMode.
- ///
- UINT32 Version;
- ///
- /// The system boot mode as determined during the HOB producer phase.
- ///
- EFI_BOOT_MODE BootMode;
- ///
- /// The highest address location of memory that is allocated for use by the HOB producer
- /// phase. This address must be 4-KB aligned to meet page restrictions of UEFI.
- ///
- EFI_PHYSICAL_ADDRESS EfiMemoryTop;
- ///
- /// The lowest address location of memory that is allocated for use by the HOB producer phase.
- ///
- EFI_PHYSICAL_ADDRESS EfiMemoryBottom;
- ///
- /// The highest address location of free memory that is currently available
- /// for use by the HOB producer phase.
- ///
- EFI_PHYSICAL_ADDRESS EfiFreeMemoryTop;
- ///
- /// The lowest address location of free memory that is available for use by the HOB producer phase.
- ///
- EFI_PHYSICAL_ADDRESS EfiFreeMemoryBottom;
- ///
- /// The end of the HOB list.
- ///
- EFI_PHYSICAL_ADDRESS EfiEndOfHobList;
- } EFI_HOB_HANDOFF_INFO_TABLE;
复制代码 EFI_HOB_MEMORY_ALLOCATION
描述内存分配环境的HOB,用于报告已分配的内存范围:MdePkg/Include/Pi/PiHob.h
- ///
- /// Describes all memory ranges used during the HOB producer
- /// phase that exist outside the HOB list. This HOB type
- /// describes how memory is used, not the physical attributes of memory.
- ///
- typedef struct {
- ///
- /// The HOB generic header. Header.HobType = EFI_HOB_TYPE_MEMORY_ALLOCATION.
- ///
- EFI_HOB_GENERIC_HEADER Header;
- ///
- /// An instance of the EFI_HOB_MEMORY_ALLOCATION_HEADER that describes the
- /// various attributes of the logical memory allocation.
- ///
- EFI_HOB_MEMORY_ALLOCATION_HEADER AllocDescriptor;
- //
- // Additional data pertaining to the "Name" Guid memory
- // may go here.
- //
- } EFI_HOB_MEMORY_ALLOCATION;
复制代码 EFI_HOB_GUID_TYPE
这是一个通用的HOB类型,用于存储自定义数据。它由GUID标识并携带特定数据
- ///
- /// Allows writers of executable content in the HOB producer phase to
- /// maintain and manage HOBs with specific GUID.
- ///
- typedef struct {
- ///
- /// The HOB generic header. Header.HobType = EFI_HOB_TYPE_GUID_EXTENSION.
- ///
- EFI_HOB_GENERIC_HEADER Header;
- ///
- /// A GUID that defines the contents of this HOB.
- ///
- EFI_GUID Name;
- //
- // Guid specific data goes here
- //
- } EFI_HOB_GUID_TYPE;
复制代码 每个HOB元素通过EFI_HOB_GENERIC_HEADER中的HobLength字段举行计算,找到下一个HOB的位置,停止HOB为EFI_HOB_TYPE_END_OF_HOB_LIST类型
- //
- // HobType of EFI_HOB_GENERIC_HEADER.
- //
- #define EFI_HOB_TYPE_HANDOFF 0x0001
- #define EFI_HOB_TYPE_MEMORY_ALLOCATION 0x0002
- #define EFI_HOB_TYPE_RESOURCE_DESCRIPTOR 0x0003
- #define EFI_HOB_TYPE_GUID_EXTENSION 0x0004
- #define EFI_HOB_TYPE_FV 0x0005
- #define EFI_HOB_TYPE_CPU 0x0006
- #define EFI_HOB_TYPE_MEMORY_POOL 0x0007
- #define EFI_HOB_TYPE_FV2 0x0009
- #define EFI_HOB_TYPE_LOAD_PEIM_UNUSED 0x000A
- #define EFI_HOB_TYPE_UEFI_CAPSULE 0x000B
- #define EFI_HOB_TYPE_FV3 0x000C
- #define EFI_HOB_TYPE_UNUSED 0xFFFE
- #define EFI_HOB_TYPE_END_OF_HOB_LIST 0xFFFF
复制代码 在MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c中有一段代码:
- /**
- Main entry point to DXE Core.
- @param HobStart Pointer to the beginning of the HOB List from PEI.
- @return This function should never return.
- **/
- VOID
- EFIAPI
- DxeMain (
- IN VOID *HobStart // 由PEI阶段传递的HOB(Handoff Block)列表开始地址
- )
- {
- EFI_STATUS Status;
- EFI_PHYSICAL_ADDRESS MemoryBaseAddress;
- UINT64 MemoryLength;
- PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;
- UINTN Index;
- EFI_HOB_GUID_TYPE *GuidHob;
- EFI_VECTOR_HANDOFF_INFO *VectorInfoList;
- EFI_VECTOR_HANDOFF_INFO *VectorInfo;
- VOID *EntryPoint;
- //
- // Setup the default exception handlers
- //
- VectorInfoList = NULL;
- GuidHob = GetNextGuidHob (&gEfiVectorHandoffInfoPpiGuid, HobStart);
- //
- }
复制代码 此处的gEfiVectorHandoffInfoPpiGuid位置:MdePkg/MdePkg.dec
- [Ppis]
- ## Include/Ppi/VectorHandoffInfo.h
- gEfiVectorHandoffInfoPpiGuid = { 0x3cd652b4, 0x6d33, 0x4dce, { 0x89, 0xdb, 0x83, 0xdf, 0x97, 0x66, 0xfc, 0xca }}
复制代码 由此可知,gEfiVectorHandoffInfoPpiGuid为PPI GUID,PPI接口头文件路径:Include/Ppi/VectorHandoffInfo.h
在MdePkg/Include/Ppi/VectorHandoffInfo.h举行访问该PPI GUID
- extern EFI_GUID gEfiVectorHandoffInfoPpiGuid;
复制代码 在其中检察该PPI接口:MdePkg/Include/Ppi/VectorHandoffInfo.h
- ///
- /// EFI_VECTOR_HANDOFF_INFO entries that describes the interrupt and/or
- /// exception vectors in use in the PEI Phase.
- ///
- typedef struct {
- //
- // The interrupt or exception vector that is in use and must be preserved.
- //
- UINT32 VectorNumber;
- //
- // A bitmask that describes the attributes of the interrupt or exception vector.
- //
- UINT32 Attribute;
- //
- // The GUID identifies the party who created the entry. For the
- // EFI_VECTOR_HANDOFF_DO_NOT_HOOK case, this establishes the single owner.
- //
- EFI_GUID Owner;
- } EFI_VECTOR_HANDOFF_INFO;
- ///
- /// Provides a description of the interrupt and/or exception vectors that
- /// were established in the SEC Phase and need to persist into PEI and DXE.
- ///
- typedef struct _EFI_PEI_VECTOR_HANDOFF_INFO_PPI {
- //
- // Pointer to an array of interrupt and /or exception vectors.
- //
- EFI_VECTOR_HANDOFF_INFO *Info;
- } EFI_PEI_VECTOR_HANDOFF_INFO_PPI;
复制代码 EFI_PEI_VECTOR_HANDOFF_INFO_PPI的作用为:将向量表信息从PEI阶段传递到DXE阶段,用于在差别固件阶段之间传递与中断向量干系的信息
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |