核心使用夥伴系統來解決記憶體分配引起的外部碎片問題。
一、資料結構描述
結構zone中的free_area陣列描述夥伴系統該陣列為free_area結構
www.2cto.com
struct zone ;
www.2cto.com
struct free_area ;
下圖為夥伴系統在管理區中的表示。
二、夥伴系統的初始化
在初始化物理管理區的時候初始化夥伴系統的,具體實現在下面的函式中:
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()
www.2cto.com
/*初始化對應zone中所有order和所有型別的鍊錶*/
static void __meminit zone_init_free_lists(struct zone *zone) }
三、夥伴系統中資料初始化
將bootmem分配器中的資料**到夥伴系統中
start_kernel()->mm_init()->mem_init()
www.2cto.com
void __init mem_init(void)
www.2cto.com
/** * free_all_bootmem - release free pages to the buddy allocator
* * returns the number of pages actually released.
*/ unsigned long __init free_all_bootmem(void)
www.2cto.com
static unsigned long __init free_all_bootmem_core(bootmem_data_t *bdata)
else
vec >>= 1;/*vec向右移動一位,表示訪問下乙個頁面*/
off++;/*偏移加一*/
} }
start += bits_per_long;/*偏移向後移動*/
} /*虛擬位址轉化為page
用於釋放bdata中的點陣圖所占有的記憶體*/
page = virt_to_page(bdata->node_bootmem_map);
pages = bdata->node_low_pfn - bdata->node_min_pfn;
/*計算bootmem分配器中所使用的頁面數,即位圖使用的頁面數*/
pages = bootmem_bootmap_pages(pages);
count += pages;/*釋放的總頁面數加*/
while (pages--)/*每次釋放乙個頁面,釋放
總共的pages個頁面*/
__free_pages_bootmem(page++, 0);
bdebug("nid=%td released=%lx\n", bdata - bootmem_node_data, count);
return count;/*返回釋放的總頁面數*/
} www.2cto.com
/* * permit the bootmem allocator to evade page validation on high-order frees
*/ void __meminit __free_pages_bootmem(struct page *page, unsigned int order)
else
set_page_refcounted(page);/*設定頁面的引用計數為1*/
/*這裡具體釋放到那個型別裡面,
要看page的裡面具體的東西,也就是
可以用相關函式來獲取他所屬的型別*/
__free_pages(page, order);/*釋放order個頁面*/
} } www.2cto.com
void __init set_highmem_pages_init(void)
totalram_pages += totalhigh_pages;
} www.2cto.com
void __init add_highpages_with_active_regions(int nid, unsigned long start_pfn,
unsigned long end_pfn)
www.2cto.com
/*用指定函式來操作活動區,在高階記憶體初始化時用了*/
void __init work_with_active_regions(int nid, work_fn_t work_fn, void *data) }
www.2cto.com
static int __init add_highpages_work_fn(unsigned long start_pfn,
unsigned long end_pfn, void *datax)
return 0; }
www.2cto.com
static void __init add_one_highpage_init(struct page *page, int pfn)
www.2cto.com
void zap_low_mappings(bool early)
if (early)
__flush_tlb();
else
flush_tlb_all();
} 到此,夥伴系統已經建立並且裡面存放了應有的記憶體資料。要從夥伴系統中分配記憶體,必須要有分配和釋放機制。後面總結具體的分配和釋放工作
linux 物理記憶體管理之夥伴系統
linux使用夥伴系統來管理物理記憶體頁 顧名思義一下,在作業系統分配記憶體的過程中,乙個記憶體塊常常被分成兩個大小相等的記憶體塊,這兩個大小相等的記憶體塊就是夥伴關係,他滿足三個條件 為了便於頁面維護,將多個頁面組成記憶體塊,每個記憶體塊都有2的方冪個頁,方冪的指數被稱為階order,order相...
linux記憶體管理 夥伴系統演算法
分配記憶體 釋放記憶體 兩個塊的大小相同 兩個塊的位址連續 兩個塊必須是從同乙個大塊分離出來的 linux把每個zone分成max order個free area,每個free are的大小是2的冪次方。max order的值為11,第0組大小為2 0個頁,第1組大小為2 1個頁,依次類推,最大的是...
Linux系統記憶體管理之夥伴系統分析
1.夥伴系統概念 夥伴系統是一種經典的記憶體管理方法。linux夥伴系統的引入為核心提供了一種用於分配一組連續的頁而建立的一種高效的分配策略,並有效的解決了外碎片問題。2.夥伴系統的組織結構 linux中的記憶體管理的 頁 大小為4kb。把所有的空閒頁分組為11個塊鍊錶,每個塊鍊錶分別包含大小為1,...