Linux核心 記憶體管理

2021-10-23 23:03:46 字數 1512 閱讀 6869

在棧上靜態分配

高階記憶體的對映

分配函式的選擇

1.32位體系結構支援4kb的頁,如果1gb的物理記憶體,物理記憶體被劃分為262144個頁

2.系統中每乙個物理頁都有乙個struct page結構體

linux核心主要使用四種區:

zone_highem叫做高階記憶體,其餘的叫做低端記憶體

記憶體分配可以占用其它區,但是不能夠同時在兩個區分配

獲得頁核心內分配和釋放記憶體的介面,所有的介面以頁為單位分配記憶體

釋放頁釋放頁時只能釋放屬於你的頁,否則可能導致系統崩潰,這點核心和使用者空間還是不同的

如果需要的是整個頁,還是使用malloc一族的函式

kmalloc確保頁在實體地址上是連續的,在虛擬位址上也是連續的

釋放記憶體的時候要注意,不要釋放不是它分配的,也不要重複釋放

vmalloc分配的記憶體虛擬位址是連續的,但是實體地址無需連續

一般情況下,只有硬體裝置必須得到實體地址連續的記憶體

但是,很多核心**使用kmalloc而不是vmalloc是出於效能考慮

1.slab機制核心思想是再空閒時建立快取物件池,包括本地物件快取池和共享物件快取池

2.本地物件快取池是本地cpu使用的

3.共享物件快取池是多個cpu共享的

4.slab描述符是slab分配器中的核心資料結構,slab描述符給每個cpu都提供乙個物件快取池

5.slab由乙個或2的n次方個連續的物理頁面組成

6.kmalloc函式的核心就是slab機制,當分配乙個30位元組的小記憶體,系統會從slab描述符中分配乙個物件

7.每個slab處於下面三種狀態之一

slab原理

1.建立slab描述符,這個描述符裡有幾個核心屬性

2.乙個cpu要從這個slab描述符中分配物件

3.slab**有兩種方式

1.核心棧小而且固定,32位每個程序有一頁或兩頁,每頁4kb

2.在核心中,我們只需要讓區域性變數不超過幾百位元組就可以,否則會溢位宕機甚至破壞資料

3.進行動態分配是比較聰明的

1.在x86的體系結構上,高於896mb的所有物理記憶體都是高階記憶體

2.一般x86處理器能夠定址範圍是4gb,高階記憶體的頁被對映到3gb-4gb

3.永久對映

永久對映的數量是有限的,當不在需要高階記憶體時,需要解除對映

4.臨時對映

臨時對映不會阻塞,可以用在不能睡眠的地方

1.如果需要連續的物理頁,可以使用低階頁分配器或者kmalloc(

2.如果想從高階記憶體進行分配,使用alloc_pages

3.如果不需要物理上連續的頁,僅需要虛擬位址上連續的頁,就使用vmalloc

4.如果要建立和撤銷很大的資料結構,考慮建立slab快取記憶體

linux核心記憶體管理

整個linux虛擬記憶體發布如下 3g以上是核心位址,0 3g是程序位址空間。在x86結構中,核心位址分為三種,這三種型別的區域如下 zone dma 記憶體開始的16mb zone normal 16mb 896mb zone highmem 896mb 結束 程序位址空間的3g,通過mmu,隨機...

linux核心記憶體管理

1.每個程序都有自己的頁面目錄,都是虛擬位址,便於mmu將虛擬位址轉換為實體地址 2.task struct mm struct pgd 3.struct page用來表示乙個物理頁面,在核心中有乙個page的陣列,用來表示當前系統中所有的物理頁面 4.頁面目錄 頁面表 物理頁面起始位址1.物理頁面...

Linux核心記憶體

核心空間占用4g虛擬記憶體的後1g 明確 不論在核心空間還是使用者空間,看到的位址都是虛擬位址,只是虛擬位址空間不一樣 但是cpu最終訪問的位址是虛擬位址對應的實體地址 虛擬位址轉換成對應的實體地址需要mmu 將來mmu利用頁表進行位址轉換 引申 uclinux支援不帶mmu的處理器 問 使用者空間...