linux内存管理——内存初始化4—mm_init函数分析
文章目录
mm_init分析
mm_init函数的功能为设置内核内存分配器,源码如下:
//path:init/main.c
/*
* Set up kernel memory allocators
*/
static void __init mm_init(void)
{
/*
* page_ext requires contiguous pages,
* bigger than MAX_ORDER unless SPARSEMEM.
*/
page_ext_init_flatmem();
init_debug_pagealloc();
report_meminit();
mem_init();//释放未使用的内存到伙伴系统
kmem_cache_init();//初始化slab/slob/slub内存管理
kmemleak_init();//初始化内存泄漏监控功能,需使能CONFIG_DEBUG_KMEMLEAK
pgtable_init();
debug_objects_mem_init();
vmalloc_init();//初始化vmalloc功能
ioremap_huge_init();
/* Should be run before the first non-init thread is created */
init_espfix_bsp();
/* Should be run after espfix64 is set up. */
pti_init();
}
mem_init函数分析
不同的体系架构实现并不相同,本文以arm32为例进行分析,源码如下:
//path:arch/arm/mm/init.c
/*
* mem_init() marks the free areas in the mem_map and tells us how much
* memory is free. This is done after various parts of the system have
* claimed their memory after the kernel image.
*/
void __init mem_init(void)
{
#ifdef CONFIG_ARM_LPAE
swiotlb_init(1);
#endif
//配置页表最大数量
set_max_mapnr(pfn_to_page(max_pfn) - mem_map);
/* this will put all unused low memory onto the freelists */
free_unused_memmap();//释放memblock中的unmap的内存到伙伴系统
memblock_free_all(); //释放memblock中未使用的pages到伙伴系统
#ifdef CONFIG_SA1111
/* now that our DMA m