- 论坛徽章:
- 0
|
setup.S->asmlinkage void __init start_kernel(void) (init/main.c) -> setup_arch -> zone_sizes_init(void)
uma中,free_area_init_node只被调用一次.
而numa,free_area_init_node被每个node都调
(1)/mm/setup.c
1155 void __init zone_sizes_init(void)
1156 {
1157 unsigned long zones_size[MAX_NR_ZONES] = {0, 0, 0};
1158 unsigned int max_dma, low;
1159
1160 max_dma = virt_to_phys((char *)MAX_DMA_ADDRESS) >> PAGE_SHIFT;
1161 low = max_low_pfn;
1162
1163 if (low
(2)/mm/page_alloc.c
free_area_init()
2139 void __init free_area_init(unsigned long *zones_size)
2140 {
2141 free_area_init_node(0, NODE_DATA(0), zones_size,
2142 __pa(PAGE_OFFSET) >> PAGE_SHIFT, NULL);
2143 }
(3)/mm/page_alloc.c
2119 void __init free_area_init_node(int nid, struct pglist_data *pgdat,
2120 unsigned long *zones_size, unsigned long node_start_pfn,
2121 unsigned long *zholes_size)
2122 {
2123 pgdat->node_id = nid;
2124 pgdat->node_start_pfn = node_start_pfn;
2125 calculate_zone_totalpages(pgdat, zones_size, zholes_size);
2126
2127 alloc_node_mem_map(pgdat);
2128
2129 free_area_init_core(pgdat, zones_size, zholes_size);
2130 }
(4)/mm/page_alloc.c.分配mem_map内存...bootmem()???
struct page *mem_map;
对与numa,没有了mem_map.而是 pgdat->node_mem_map ;(没有对mem_map)
对于uma,mem_map = lmap,即是NODE_DATA(0)->node_mem_map;
在kernel2.6,numa体系下,根本不再有mem_map这个全局变量,
2091 static void __init alloc_node_mem_map(struct pglist_data *pgdat)
2092 {
2093 /* Skip empty nodes */
2094 if (!pgdat->node_spanned_pages)
2095 return;
2096
2097 #ifdef CONFIG_FLAT_NODE_MEM_MAP
2098 /* ia64 gets its own node_mem_map, before this, without bootmem */
2099 if (!pgdat->node_mem_map) {
2100 unsigned long size;
2101 struct page *map;
2102
2103 size = (pgdat->node_spanned_pages + 1) * sizeof(struct page);
2104 map = alloc_remap(pgdat->node_id, size);
2105 if (!map)
2106 map = alloc_bootmem_node(pgdat, size);
2107 pgdat->node_mem_map = map;
2108 }
2109 #ifdef CONFIG_FLATMEM
2110 /*
2111 * With no DISCONTIG, the global mem_map is just set as node 0's
2112 */
2113 if (pgdat == NODE_DATA(0))
2114 mem_map = NODE_DATA(0)->node_mem_map;
2115 #endif
2116 #endif /* CONFIG_FLAT_NODE_MEM_MAP */
2117 }
(5)free_area_init_core(pgdat, zones_size, zholes_size);
初始化每个zone...的一些域
(6)
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/17526/showart_1079651.html |
|