linux内存管理之初始化

start_kernel
    =>page_address_init();
    =>setup_arch
        =>max_low_pfn = setup_memory();
            =>min_low_pfn = PFN_UP(init_pg_tables_end);
            =>find_max_pfn();
            =>max_low_pfn = find_max_low_pfn();
            =>setup_bootmem_allocator();
                =>bootmap_size = init_bootmem(min_low_pfn, max_low_pfn);
                    =>return init_bootmem_core(NODE_DATA(0), start, 0, pages);//Called once to set up the allocator itself.
                =>register_bootmem_low_pages(max_low_pfn);
                =>reserve_bootmem(__pa_symbol(_text), (PFN_PHYS(min_low_pfn) + bootmap_size + PAGE_SIZE-1) - __pa_symbol(_text));
                =>reserve_bootmem(0, PAGE_SIZE);
                =>reserve_ebda_region();
        =>paging_init();
        =>remapped_pgdat_init();
        =>zone_sizes_init();
            =>max_zone_pfns[ZONE_DMA] = virt_to_phys((char *)MAX_DMA_ADDRESS) >> PAGE_SHIFT;
            max_zone_pfns[ZONE_NORMAL] = max_low_pfn;
            =>max_zone_pfns[ZONE_HIGHMEM] = highend_pfn;
            add_active_range(0, 0, highend_pfn);
            =>free_area_init_nodes(max_zone_pfns);//Initialise all pg_data_t and zone data
                =>setup_nr_node_ids();
                =>for_each_online_node(nid) {
                    pg_data_t *pgdat = NODE_DATA(nid);
                    free_area_init_node(nid, pgdat, NULL, find_min_pfn_for_node(nid), NULL);
        =>e820_register_memory();
    =>build_all_zonelists();
    =>page_alloc_init();
    =>mem_init();//停用bootmem分配器并迁移到实际的内存管理器(比如伙伴系统)
        =>totalram_pages += free_all_bootmem();
        =>set_highmem_pages_init(bad_ppro);
    =>kmem_cache_init();
    =>setup_per_cpu_pageset();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值