内存管理物理地址空间的有效性检测主要讲述了Linux内核是如何从memblock.memory->regions->page->section->mem_section建立物理地址之间关系的。但是我们并没有对mem_section所管理的有效页框创建相应的映射关系以及初始化每个section下的页框属性。所以linux内核是如何完成这件事的呢?
内存管理(11)物理地址空间的有效性检测主要讲述了Linux内核是如何从memblock.memory
->regions->page->section->mem_section建立物理地址之间关系的。但是我们并没有对mem_section所管理的有效页框创建相应的映射关系以及初始化每个section下的页框属性。所以linux 内核是如何完成这件事的呢?
1.遍历系统中所有可能存在的section,过滤无效的,计算每一个node中有多少个有效的section
2.为每个node申请一个元素数量为有效section个数数量相等的unsigned long*指针数组
3.把每个有效section的unsigned long*指针数组中的指针指向一个数组,这个数组存放了当前section里面所有页的pageblock_flags
4.mem_section.section_mem_map使用了同样的套路
系统中稀疏内存模型分布图
sparse_init函数
第17行:设置pageblock_order大小,相关函数实现细节如下↓
sparse_init实现(2)
sparse_init实现(3)
sparse_init实现(4)
set_pageblock_order函数
set_pageblock_order实现
alloc_usemap_and_memmap函数:
alloc_usemap_and_memmap实现(1)
alloc_usemap_and_memmap实现(2)
alloc_usemap_and_memmap实现(3)
sparse_early_usemaps_alloc_node函数
sparse_early_usemaps_alloc_node实现
sparse_early_mem_map_alloc->sparse_mem_map_populate函数
sparse_mem_map_populate实现
vmemmap_populate函数
vmemmap_populate实现(1)
vmemmap_populate实现(2)
,