PEI 阶段内存分配的函数有两个:
- AllocatePage()
- AllocatePool()
具体请参考Vol1_PEI_1_5 4.6
还是看图,有的时候,我看spec,我就喜欢看总纲的图,每次都看,每次看会有不同的理解。
关于这两个函数AllocatePage(),AllocatePool()。如果仅仅通过字面上,一个是分配比较大内存,一个是比较小的内存。
但是两个function 还是有点差别的。主要差别如下:
- AllocatePage() 需要memory install 之后才能使用,而AllocatePool() 不需要。
- AllocatePage() 分配是的内存在蓝色框里,并且在绿色框里增加一个EFI_HOB_TYPE_MEMORY_ALLOCATION 的Hob; AllocatePool() 分配内存返回地址是在绿色框内,并且在绿色框里增加EFI_HOB_TYPE_MEMORY_POOL 类型的Hob;
- 地址对齐不同
- AllocatePage 会被记录到GCD 里,AllocatePool() 不会。
关于这两个function 具体实现,我不想贴代码,还是直接看上图吧 仔细观察黄色框部分和绿色框中Allocate 1 2 3 字的部分。
黄色框的部分是我们用AllocatePage() 分配内存时候的状况,绿色框里的Allocate 1 2 3 是我们用AllocatePool() 分配内存的时候。也回想一下,上篇文章,当Pei memory install 的时候PHIT 指针的情况
PHIT->EfiMemoryTop = dPeiMemHi
PHIT->EfiMemoryBottom = dPeiMemBase
PHIT->EfiFreeMemoryTop = dPeiMemHi
PHIT->EfiFreeMemoryBottom=PHIT->EfiEndOfHobList+sizeof (EFI_HOB_GENERIC_HEADER);
刚开始EfiMemoryTop 和 EfiFreeMemoryTop 是相等的,当我们用AllocatePage 分配两端内存两个黄色框的Memory Allocation 2,3 的时候EfiFreeMemoryTop 就向下移动到黄色框底端(当然,还会添加一个hub 在绿色区域,EfiFreeMemoryBottom 也会往移动)。相反,当我们用AllocatePool 的时候EfiFeeMemoryBottom 就往上移动。
EFI 阶段的内存其实也谈不上管理,它只是一个记录作用。当然它也不支持Free memory 的function 。