linux版本:4.14.74
硬件:ARMV8 A53
完成DTB的映射之后,内核可以访问这一段的内存了, Dtb通过choosen node/memory node/reserved-memory node等节点勾勒出整个内存布局的情况,为后续内存管理初始化奠定基础。Dtb中有了内存布局的信息之后,如何管理这些模块呢,这就是引导内存分配器memblock
1. struct memblock {
2. bool bottom_up; /* is bottom up direction? */
3. phys_addr_t current_limit;
4. struct memblock_type memory;
5. struct memblock_type reserved;
6. #ifdef CONFIG_HAVE_MEMBLOCK_PHYS_MAP
7. struct memblock_type physmem;
8. #endif
9. };
- Memory:内存类型,包括已分配和未分配内存
- Reserved:已分配内存
- Physmem:物理内存类型
内存类型memory是物理内存类型的子集,在引导内核时可以使用内核参数指定可用内存的大小,导致内核不能看见所有内存。
内核在收集了若干和memory相关的信息后,会调用memblock模块的接口API(例如:memblock_add、memblock_reserve、memblock_remove等)来管理这些内存布局的信息。内核需要动态管理起来的内存资源被保存在memblock的memory type的数组中(下图中的绿色block,按照地址的大小顺序排列),而那些需要预留的,不需要内核管理的内存被保存在memblock的reserved type的数组中(下图中的青色block,也是按照地址的大小顺序排列)。除了这些信息以外,memblock还具备了分配内存的功能,但要注意的是,memblock分配得到仍是物理地址,页表映射还没完成,无法得到虚拟地址