免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1041 | 回复: 0

/mm/setup.c zone_sizes_init [复制链接]

论坛徽章:
0
发表于 2008-07-13 13:30 |显示全部楼层



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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP