linux記憶體管理 使用者空間和核心空間

2021-08-07 17:23:57 字數 1153 閱讀 9799

關於虛擬記憶體有三點需要注意:

上圖展示了整個程序位址空間的分布,其中4g的位址空間分為兩部分,在使用者空間內,對應了記憶體分布的五個段:資料段、**段、bss段、堆、棧。在上篇文章中有詳細的介紹。

這個圖示核心使用者空間的劃分,圖中最重要的就是高階記憶體的對映

其中kmalloc和vmalloc函式申請的空間對應著不同的區域,同時又不同的含義。

這張圖中頁解釋了三者的不同關係,和上篇文章中的內容有相似之處。

夥伴演算法:

一種物理記憶體分配和**的方法,物理記憶體所有空閒頁都記錄在buddy鍊錶中。首選,系統建立乙個鍊錶,鍊錶中的每個元素代表一類大小的物理記憶體,分別為2的0次方、1次方、2次方,個頁大小,對應4k、8k、16k的記憶體,沒一類大小的記憶體又有乙個鍊錶,表示目前可以分配的物理記憶體。例如現在僅存需要分配8k的物理記憶體,系統首先從8k那個鍊錶中查詢有無可分配的記憶體,若有直接分配;否則查詢16k大小的鍊錶,若有,首先將16k一分為二,將其中乙個分配給程序,另乙個插入8k的鍊錶中,若無,繼續查詢32k,若有,首先把32k一分為二,其中乙個16k大小的記憶體插入16k鍊錶中,然後另乙個16k繼續一分為二,將其中乙個插入8k的鍊錶中,另乙個分配給程序........以此類推。當記憶體釋放時,檢視相鄰記憶體有無空閒,若存在兩個聯絡的8k的空閒記憶體,直接合併成乙個16k的記憶體,插入16k鍊錶中。(夥伴演算法用於物理記憶體分配方案)

slab演算法:

是一種對夥伴算的一種補充,對於使用者程序的記憶體分配,夥伴演算法已經夠好了,但對於核心程序,還需要存在一類很小的資料(位元組大小,比如程序描述符、虛擬記憶體描述符等),若每次給幾個位元組的資料分配乙個4kb的頁,實在太浪費,於是就有了slba演算法,slab演算法其實就是把乙個頁用力劈成一小塊一小塊,然後再分配。

linux記憶體管理 使用者空間和核心空間

關於虛擬記憶體有三點需要注意 上圖展示了整個程序位址空間的分布,其中4g的位址空間分為兩部分,在使用者空間內,對應了記憶體分布的五個段 資料段 段 bss段 堆 棧。在上篇文章中有詳細的介紹。這個圖示核心使用者空間的劃分,圖中最重要的就是高階記憶體的對映 其中kmalloc和vmalloc函式申請的...

linux記憶體管理 使用者空間和核心空間

關於虛擬記憶體有三點需要注意 上圖展示了整個程序位址空間的分布,其中4g的位址空間分為兩部分,在使用者空間內,對應了記憶體分布的五個段 資料段 段 bss段 堆 棧。在上篇文章中有詳細的介紹。這個圖示核心使用者空間的劃分,圖中最重要的就是高階記憶體的對映 其中kmalloc和vmalloc函式申請的...

記憶體管理之使用者空間

32 位的平台上,線性位址空間為固定的 4gb,並且由於採用了保護機制,linux核心將這 4gb 分為兩部分,線性位址較高的 1gb 0xc0000000 到 0xffffffff 為共享的核心空間 而較低的 3gb 為每個程序的使用者空間。由於每個程序都不能直接訪問核心空間,而是通過系統呼叫間接...