1,本文大部分来自:http://blog.csdn.net/vanbreaker/article/details/7611585
2,在start_kernel()-->paging_init()-->zone_sizes_init()-->free_area_init_nodes()-->free_area_init_node()-->free_area_init_core()-->init_currently_empty_zone()->zone_init_free_lists()中,free_area的相关域都被初始化
- static void __meminit zone_init_free_lists(struct zone *zone)
- {
- int order, t;
- for_each_migratetype_order(order, t) {
- /*链表初始化为空链表*/
- INIT_LIST_HEAD(&zone->free_area[order].free_list[t]);
- /*内存块数量初始化为0*/
- zone->free_area[order].nr_free = 0;
- }
- }
start_kernel()-->mm_init()-->mem_init(),负责统计所有可用的低端内存和高端内存,并释放到伙伴系统中
在free_area_init_core()-->memmap_init()(-->memmap_init_zone() )-->set_pageblock_migratetype(),将每个pageblock的起始页框对应的struct zone当中的pageblock_flags代表的位图相关区域标记为可移动的,表示该pageblock为可移动的,也就是说内核初始化伙伴系统时,所有的页都被标记为可移动的
在内核首先通过setup_arch()-->paging_init()-->zone_sizes_init()来初始化节点和管理区的一些数据项其中核心函数为free_area_init_node(),用来针对特定的节点进行初始化
至此,节点和管理区的关键数据已完成初始化,内核在后面为内存管理做得一个准备工作就是将所有节点的管理区都链入到zonelist中,便于后面内存分配工作的进行内核在start_kernel()-->build_all_zonelist()中完成zonelist的初始化