DXE内存服务
DXE阶段内存布局:
DXE阶段的内存服务包括:
- 系统启动过程中,存储分配及释放服务;
- 整个动态存储管理的实现,即如何从GCD中获取可使用的系统资源,构建初始化存储空间;如何从GCD中获取后续系统资源以维持整个存储空间管理的正常运行。
System Memory
用于内存的分配和释放,以及获取系统的内存映射。
AllocatePages()
函数分配请求的页面数,返回一个指针指向内存引用的位置中的页面范围的基址。该函数通过扫描内存映射定位空闲的内存页面。当发现一个物理上连续的页面足够大且满足Type类型时,函数会更改内存映射,指示这些页面是 MemoryType 类型。
FreePages()
函数将由 AllocatePages() 分配给固件的内存返还给系统。
GetMemoryMap()
函数返回当前的内存映射。映射是一个内存描述符数组,每个描述符描述一个连续的内存块。不管内存是如何使用的,内存映射都描述,包括由AllocatePages() 和 AllocatePool()分配的以及固件自己使用的内存块。
内存映射仅用于描述系统中存在的内存。OS可以自行决定使用内存映射中没有描述的内存范围地址。
AllocatePool()
函数从类型为PoolType的内存中分配Size字节大小的内存区域,并返回Buffer引用的位置中分配的内存地址。所有分配都是八字节对齐的。
FreePool()
动态存储
关键数据结构
MEMORY_MAP
MEMORY_MAP 是用来存储空间信息的链表节点。
- Start和End:描述地址的范围;
- FromPages:描述该节点在临时数组mMapStack 中还是动态存储页面中;
- VirtualStart :用于启动操作系统时进行物理地址到虚拟地址空间转换。
EFI_MEMORY_TYPE_STATISTICS
用于跟踪每种内存类型的内存区域以合并相似内存类型的条目。
- BaseAddress和MaximumAddress:描述存储地址空间的范围;
- CurrentNumberOfPages:记录该种类的存储空间还有多少空间可以被分配;
- NumberOfPages:记录页面总数,包块已分配的和未分配的。