內核使用伙伴系統來解決內存分配引起的外部碎片問題。
一、數據結構描述
結構zone中的free_area數組描述伙伴系統該數組為free_area結構
- struct zone {
- ……
- struct free_area free_area[MAX_ORDER];
- ……
- };
- struct free_area {/*鏈表類型為5類,對於分類為新加入的*/
- struct list_head free_list[MIGRATE_TYPES];
- unsigned long nr_free;
- };
下圖為伙伴系統在管理區中的表示。
二、伙伴系統的初始化
在初始化物理管理區的時候初始化伙伴系統的,具體實現在下面的函數中:
Start_kernel()->setup_arch()->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()
- /*初始化對應zone中所有order和所有類型的鏈表*/
- 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]);
- zone->free_area[order].nr_free = 0;
- }
- }