linux内存管理——内存初始化4---mm_init函数分析

本文详细分析了Linux内存管理中的mm_init函数,以及mem_init、set_max_mapnr、free_unused_memmap、memblock_free_all和mem_init_print_info等关键函数的作用,涵盖了内存初始化、页表配置、伙伴系统和内存监控等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值