linux核心虛擬記憶體之物理頁面分配

2021-08-08 12:52:28 字數 2344 閱讀 8787

記憶體碎片通常分為外部碎片和內部碎片兩種。外部碎片指記憶體全部是分散小塊而無法滿足大塊記憶體申請的需求;內部碎片指申請到一頁或幾頁記憶體後只使用了部分記憶體造成其他記憶體浪費。linux因此引入了夥伴演算法解決外部碎片問題,slab方式解決內部碎片問題,本章主要講解夥伴演算法,下一章講解slab層。

夥伴演算法是乙個結合了2的方冪分配器與空閒緩衝區合併技術的分配方案。記憶體被分成了含有很多頁面的大塊,每乙個塊都是2的方冪個頁面大小。如果找不到想要的塊,上一級的大塊會被分成兩部分,這兩部分彼此就成了夥伴,其中一半被用來分配而另外一半空閒放入本級空閒鍊錶,這些塊會繼續被二分直至產生乙個所需大小的塊。當乙個塊被最終釋放時,其夥伴將被檢測出來,如果空閒就合併兩者。

夥伴系統維護空閒頁面所組成的塊,每一塊都是2的方冪個頁面。每個管理區struct zone中struct free_area free_area[max_order]陣列就用於管理夥伴演算法:

#define max_orderconfig_force_max_zoneorder =11

struct free_area {

struct list_head   free_list[migrate_types]; //空閒鍊錶

unsigned long       nr_free; //空閒鍊錶個數

max_order = 11意味這最大支援的連續物理快2^11* 4k = 8m。其示意圖如下:

由於本arm體系結構只有乙個zone_normal管理區,在核心夥伴演算法初始化完成後,其夥伴演算法的空閒鍊錶數目如下:

free_area:0, nr_free:2

free_area:1, nr_free:0

free_area:2, nr_free:2

free_area:3, nr_free:2

free_area:4, nr_free:1

free_area:5, nr_free:2

free_area:6, nr_free:2

free_area:7, nr_free:2

free_area:8, nr_free:1

free_area:9, nr_free:1

free_area:10, nr_free:1

free_area:11, nr_free:29

(1)alloc_page

#define alloc_page(gfp_mask)alloc_pages(gfp_mask, 0)

分配乙個頁面並返回乙個頁位址

(2)alloc_pages

#define alloc_pages(gfp_mask, order) \

alloc_pages_node(numa_node_id(), gfp_mask, order)

分配2^order數量的頁面並返回第乙個頁位址

(3)page_address

該函式返回乙個指標,指向給定物理頁當前所在的邏輯位址

(4)get_zeroed_page

unsigned long get_zeroed_page(gfp_tgfp_mask)

分配乙個頁面,對其初始化成0值,返回乙個虛擬位址

(5)__get_free_pages

unsigned long __get_free_pages(gfp_tgfp_mask, unsigned int order);

分配2^order數量的頁面並返回乙個虛擬位址

(6)__get_free_page

#define __get_free_page(gfp_mask) \

__get_free_pages((gfp_mask), 0)

分配乙個頁面並返回虛擬位址

(7)__free_pages

void __free_pages(struct page *page,unsigned int order);

從給定頁面中釋放2^order頁面大小的塊

(8)free_pages

void free_pages(unsigned long addr,unsigned int order);

從給定虛擬位址空間釋放2^order頁面大小的塊

(9)__free_page

#define __free_page(page)__free_pages((page), 0)

從給定頁面中釋放1個頁面

(10)free_page

#define free_page(addr) free_pages((addr),0)

從給定的虛擬位址空間釋放乙個頁面

釋放需要注意的是:只能釋放當初申請的頁,如果傳遞了錯誤的引數,可能會導致系統崩潰。

linux 物理記憶體和虛擬記憶體

vmstat是virtual memory statistics虛擬記憶體統計縮寫 物理記憶體是計算機記憶體的大小,從物理記憶體中讀寫資料比硬碟中讀寫資料要快很多,而記憶體是有限的,所以就有了物理記憶體和虛擬記憶體的概念。物理記憶體就是硬體的記憶體,是真正的記憶體。虛擬記憶體是為了滿足物理記憶體不足...

物理記憶體和虛擬記憶體

1.物理記憶體和虛擬記憶體 直接從物理記憶體讀取資料比從硬碟讀寫資料要快得多,因此,我們希望所有的資料的讀寫在記憶體中完成,但是記憶體是有限的,這樣就引出了物理記憶體與虛擬記憶體的概念。物理記憶體是系統硬體提供的記憶體大小,是真正的記憶體。虛擬記憶體是為了滿足物理記憶體不足而提出的策略,利用磁碟空間...

虛擬記憶體和物理記憶體

虛擬記憶體 物理記憶體 物理記憶體,在應用中,物理上,真實的插在板子上的記憶體是多大就是多大了。而在cpu中的概念,物理記憶體就是cpu的位址線可以直接進行定址的記憶體空間大小。比如8086只有20根位址線,那麼它的定址空間就是1mb,我們就說8086能支援1mb的物理記憶體,及時我們安裝了128m...