深入UEFI内存管理图解HOB List的构建与Resource Descriptor HOB的奥秘当计算机从冷启动到操作系统加载的瞬间UEFI固件在幕后完成了一场精密的内存编排。这场编排的核心剧本正是由一系列名为HOBHand-Off Block的数据结构串联而成。本文将带您深入UEFI启动初期最关键的内存地图构建过程揭示Resource Descriptor HOB如何成为系统内存管理的基石。1. HOB ListUEFI启动早期的内存交响乐在x86架构的UEFI启动流程中PEI阶段Pre-EFI Initialization如同交响乐团的指挥负责搭建整个系统的初始内存框架。这个框架的物理载体就是HOB List——一个由连续内存块构成的单向链表。HOB List的三大核心特性单向增长结构每个新HOB总是追加在列表末尾自描述格式通过EFI_HOB_GENERIC_HEADER实现类型和长度的自我声明阶段隔离PEI阶段可修改DXE阶段只读关键构建过程示例// PHIT HOB初始化代码片段 EFI_STATUS PeiCoreBuildHobHandoffInfoTable( IN EFI_BOOT_MODE BootMode, IN EFI_PHYSICAL_ADDRESS MemoryBegin, IN UINT64 MemoryLength) { EFI_HOB_HANDOFF_INFO_TABLE *Hob (VOID*)(UINTN)MemoryBegin; EFI_HOB_GENERIC_HEADER *HobEnd (EFI_HOB_GENERIC_HEADER*)(Hob1); Hob-Header.HobType EFI_HOB_TYPE_HANDOFF; Hob-Header.HobLength sizeof(EFI_HOB_HANDOFF_INFO_TABLE); HobEnd-HobType EFI_HOB_TYPE_END_OF_HOB_LIST; HobEnd-HobLength sizeof(EFI_HOB_GENERIC_HEADER); Hob-EfiMemoryTop MemoryBegin MemoryLength; Hob-EfiMemoryBottom MemoryBegin; Hob-EfiEndOfHobList (EFI_PHYSICAL_ADDRESS)(UINTN)HobEnd; return EFI_SUCCESS; }2. Resource Descriptor HOB内存属性的雕刻师在所有HOB类型中EFI_HOB_RESOURCE_DESCRIPTOR扮演着物理内存属性标签的角色。它通过两个关键维度描述内存区域属性维度说明典型取值示例ResourceType内存区域的基本类型EFI_RESOURCE_SYSTEM_MEMORYResourceAttribute内存的详细特征位图EFI_RESOURCE_ATTRIBUTE_TESTED内存标记实战案例// 标记0xA0000-0xFFFFF为保留内存 BuildResourceDescriptorHob( EFI_RESOURCE_MEMORY_RESERVED, EFI_RESOURCE_ATTRIBUTE_TESTED, 0xA0000, 0x60000); // 标记0x100000起为可用系统内存 BuildResourceDescriptorHob( EFI_RESOURCE_SYSTEM_MEMORY, EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE, 0x100000, PeiMemBase - 0x100000);注意ResourceAttribute采用位掩码设计可通过OR运算组合多个属性如TESTED | WRITE_BACK_CACHEABLE3. 从HOB到GCD内存管理的进化之路当DXE阶段接管系统时全局内存管理器GCD会将HOB描述的内存信息转化为更复杂的内存映射表。这个转换过程遵循以下步骤资源收集遍历所有EFI_HOB_RESOURCE_DESCRIPTOR类型的HOB属性映射将HOB属性转换为GCD能理解的缓存策略空间合并合并相邻且属性相同的内存区域服务发布生成gEfiMemoryArchProtocolGuid服务关键转换逻辑// DXE核心中的资源处理伪代码 ProcessHobResources() { EFI_PEI_HOB_POINTERS Hob; Hob.Raw GetHobList(); while (!END_OF_HOB_LIST(Hob)) { if (Hob.Header-HobType EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) { CoreAddMemoryDescriptor( Hob.ResourceDescriptor-PhysicalStart, Hob.ResourceDescriptor-ResourceLength, ConvertToMemoryType(Hob.ResourceDescriptor-ResourceAttribute)); } Hob.Raw GET_NEXT_HOB(Hob); } }4. 实战自定义HOB的开发艺术除了标准HOB类型开发者可以通过GUID Extension HOB实现阶段间数据传递。以下是创建和使用自定义HOB的最佳实践PEI阶段创建HOB// 定义自定义数据结构 typedef struct { UINT8 Version; UINT32 CrashDumpSize; UINT64 ReservedRanges[4]; } PLATFORM_SPECIFIC_HOB; // 构建GUID HOB EFI_STATUS CreatePlatformHob() { PLATFORM_SPECIFIC_HOB *Hob BuildGuidHob( gPlatformHobGuid, sizeof(PLATFORM_SPECIFIC_HOB)); if (Hob) { Hob-Version 0x10; Hob-CrashDumpSize SIZE_2MB; return EFI_SUCCESS; } return EFI_OUT_OF_RESOURCES; }DXE阶段读取HOB// 检索自定义HOB PLATFORM_SPECIFIC_HOB* GetPlatformHob() { EFI_PEI_HOB_POINTERS Hob; Hob.Raw GetFirstGuidHob(gPlatformHobGuid); return (Hob.Raw ! NULL) ? (PLATFORM_SPECIFIC_HOB*)GET_GUID_HOB_DATA(Hob.Raw) : NULL; }在开发自定义HOB时需要特别注意内存对齐问题。x86架构要求HOB数据按8字节对齐而某些RISC架构可能需要16字节对齐。
深入UEFI内存管理:图解HOB List的构建与Resource Descriptor HOB的奥秘
发布时间:2026/5/30 22:58:58
深入UEFI内存管理图解HOB List的构建与Resource Descriptor HOB的奥秘当计算机从冷启动到操作系统加载的瞬间UEFI固件在幕后完成了一场精密的内存编排。这场编排的核心剧本正是由一系列名为HOBHand-Off Block的数据结构串联而成。本文将带您深入UEFI启动初期最关键的内存地图构建过程揭示Resource Descriptor HOB如何成为系统内存管理的基石。1. HOB ListUEFI启动早期的内存交响乐在x86架构的UEFI启动流程中PEI阶段Pre-EFI Initialization如同交响乐团的指挥负责搭建整个系统的初始内存框架。这个框架的物理载体就是HOB List——一个由连续内存块构成的单向链表。HOB List的三大核心特性单向增长结构每个新HOB总是追加在列表末尾自描述格式通过EFI_HOB_GENERIC_HEADER实现类型和长度的自我声明阶段隔离PEI阶段可修改DXE阶段只读关键构建过程示例// PHIT HOB初始化代码片段 EFI_STATUS PeiCoreBuildHobHandoffInfoTable( IN EFI_BOOT_MODE BootMode, IN EFI_PHYSICAL_ADDRESS MemoryBegin, IN UINT64 MemoryLength) { EFI_HOB_HANDOFF_INFO_TABLE *Hob (VOID*)(UINTN)MemoryBegin; EFI_HOB_GENERIC_HEADER *HobEnd (EFI_HOB_GENERIC_HEADER*)(Hob1); Hob-Header.HobType EFI_HOB_TYPE_HANDOFF; Hob-Header.HobLength sizeof(EFI_HOB_HANDOFF_INFO_TABLE); HobEnd-HobType EFI_HOB_TYPE_END_OF_HOB_LIST; HobEnd-HobLength sizeof(EFI_HOB_GENERIC_HEADER); Hob-EfiMemoryTop MemoryBegin MemoryLength; Hob-EfiMemoryBottom MemoryBegin; Hob-EfiEndOfHobList (EFI_PHYSICAL_ADDRESS)(UINTN)HobEnd; return EFI_SUCCESS; }2. Resource Descriptor HOB内存属性的雕刻师在所有HOB类型中EFI_HOB_RESOURCE_DESCRIPTOR扮演着物理内存属性标签的角色。它通过两个关键维度描述内存区域属性维度说明典型取值示例ResourceType内存区域的基本类型EFI_RESOURCE_SYSTEM_MEMORYResourceAttribute内存的详细特征位图EFI_RESOURCE_ATTRIBUTE_TESTED内存标记实战案例// 标记0xA0000-0xFFFFF为保留内存 BuildResourceDescriptorHob( EFI_RESOURCE_MEMORY_RESERVED, EFI_RESOURCE_ATTRIBUTE_TESTED, 0xA0000, 0x60000); // 标记0x100000起为可用系统内存 BuildResourceDescriptorHob( EFI_RESOURCE_SYSTEM_MEMORY, EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE, 0x100000, PeiMemBase - 0x100000);注意ResourceAttribute采用位掩码设计可通过OR运算组合多个属性如TESTED | WRITE_BACK_CACHEABLE3. 从HOB到GCD内存管理的进化之路当DXE阶段接管系统时全局内存管理器GCD会将HOB描述的内存信息转化为更复杂的内存映射表。这个转换过程遵循以下步骤资源收集遍历所有EFI_HOB_RESOURCE_DESCRIPTOR类型的HOB属性映射将HOB属性转换为GCD能理解的缓存策略空间合并合并相邻且属性相同的内存区域服务发布生成gEfiMemoryArchProtocolGuid服务关键转换逻辑// DXE核心中的资源处理伪代码 ProcessHobResources() { EFI_PEI_HOB_POINTERS Hob; Hob.Raw GetHobList(); while (!END_OF_HOB_LIST(Hob)) { if (Hob.Header-HobType EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) { CoreAddMemoryDescriptor( Hob.ResourceDescriptor-PhysicalStart, Hob.ResourceDescriptor-ResourceLength, ConvertToMemoryType(Hob.ResourceDescriptor-ResourceAttribute)); } Hob.Raw GET_NEXT_HOB(Hob); } }4. 实战自定义HOB的开发艺术除了标准HOB类型开发者可以通过GUID Extension HOB实现阶段间数据传递。以下是创建和使用自定义HOB的最佳实践PEI阶段创建HOB// 定义自定义数据结构 typedef struct { UINT8 Version; UINT32 CrashDumpSize; UINT64 ReservedRanges[4]; } PLATFORM_SPECIFIC_HOB; // 构建GUID HOB EFI_STATUS CreatePlatformHob() { PLATFORM_SPECIFIC_HOB *Hob BuildGuidHob( gPlatformHobGuid, sizeof(PLATFORM_SPECIFIC_HOB)); if (Hob) { Hob-Version 0x10; Hob-CrashDumpSize SIZE_2MB; return EFI_SUCCESS; } return EFI_OUT_OF_RESOURCES; }DXE阶段读取HOB// 检索自定义HOB PLATFORM_SPECIFIC_HOB* GetPlatformHob() { EFI_PEI_HOB_POINTERS Hob; Hob.Raw GetFirstGuidHob(gPlatformHobGuid); return (Hob.Raw ! NULL) ? (PLATFORM_SPECIFIC_HOB*)GET_GUID_HOB_DATA(Hob.Raw) : NULL; }在开发自定义HOB时需要特别注意内存对齐问题。x86架构要求HOB数据按8字节对齐而某些RISC架构可能需要16字节对齐。