[linux内存]伙伴系统学习笔记(二)--内存系统初始化

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的相关域都被初始化

[cpp] view plaincopy技术分享技术分享
 
  1. static void __meminit zone_init_free_lists(struct zone *zone)    
  2. {    
  3.     int order, t;    
  4.     for_each_migratetype_order(order, t) {    
  5.         /*链表初始化为空链表*/    
  6.         INIT_LIST_HEAD(&zone->free_area[order].free_list[t]);    
  7.         /*内存块数量初始化为0*/    
  8.         zone->free_area[order].nr_free = 0;    
  9.     }    
  10. }   



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的初始化

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。