Kernel启动流程源码解析 8 mm_init

本文详细介绍了Linux内核启动过程中的mm_init函数,包括mem_init、kmem_cache_init、percpu_init_late和vmalloc_init等关键步骤。mem_init负责内存管理和初始化,如计算系统内存大小、释放空闲页到伙伴系统;kmem_cache_init启动slab内存分配器;percpu_init_late初始化每CPU变量;vmalloc_init初始化vmalloc内存分配机制。这些步骤对于理解和优化内核内存管理至关重要。
摘要由CSDN通过智能技术生成

一 mm_init

1.0 mm_init

定义在init/main.c中
static void __init mm_init(void)
{
    /*
     * page_cgroup requires contiguous pages,
     * bigger than MAX_ORDER unless SPARSEMEM.
     */
    page_cgroup_init_flatmem(); // mem_cgroup_disabled为true,直接返回了
    mem_init(); // 从memboot分配器转化为伙伴系统分配器
    kmem_cache_init(); 初始化kmem_cache和kmalloc_caches,使能slab内存分配器
    percpu_init_late(); // 每cpu变量
    pgtable_cache_init(); // arm64中 #define pgtable_cache_init() do { } while (0)
    vmalloc_init();
}

1.1 mem_init

void __init mem_init(void)
{
    unsigned long reserved_pages, free_pages;
    struct memblock_region *reg;

    arm64_swiotlb_init(); // 初始化software IO TLB,用于DMA API

    max_mapnr   = pfn_to_page(max_pfn + PHYS_PFN_OFFSET) - mem_map; // max_pfn是物理内存的最大页帧号,PHYS_PFN_OFFSET是物理内存的起始地址的页帧号 // 最高内存页指针减去最低内存页指针,所以max_mapnr存放的是系统的内存页数

#ifndef CONFIG_SPARSEMEM_VMEMMAP
    /* this will put all unused low memory onto the freelists */
    free_unused_memmap();
#endif

    totalram_pages += free_all_bootmem(); // 释放空闲的页到伙伴系统分配器

    reserved_pages = free_pages = 0;

    for_each_memblock(memory, reg) { // 遍历memblock.memory,统计空闲的页和保留的页
        unsigned int pfn1, pfn2;
        struct page *page, *end;

        pfn1 = __phys_to_pfn(reg->base);
        pfn2 = pfn1 + __phys_to_pfn(reg->size);

        page = pfn_to_page(pfn1);
        end  = pfn_to_page(pfn2 - 1) + 1;

        do {
            if (PageReserved(page))
                reserved_pages++;
            else if (!page_count(page))
                free_pages++;
            page++;
        } while (page < end);
    }

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值