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();