linux核心記憶體管理

2021-08-15 08:03:55 字數 2282 閱讀 2355

整個linux虛擬記憶體發布如下:3g以上是核心位址,0~3g是程序位址空間。

在x86結構中,核心位址分為三種,這三種型別的區域如下:

zone_dma 記憶體開始的16mb

zone_normal 16mb~896mb

zone_highmem 896mb ~ 結束

程序位址空間的3g,通過mmu,隨機對映到實體地址896m之後的位址上。

核心位址的zone_dma+zone_normal,核心3g~3g+896m位置,則一一對映到實體地址的0-~896m。

而核心位址的zone_highmem,即3g+896m~4g位置,和程序位址空間一樣,可以隨機對映到物理記憶體896m之後的位址上。

所以,核心借助zone_highmem位置,可以訪問896m之後的所有物理記憶體,再加上zone_dma+zone_nomal和物理記憶體0~896m一樣對映,所以,核心可以訪問所有的物理記憶體,而程序位址空間最多隻可以訪問實體地址896m外的所有位址。

32位系統,理論上可以訪問的虛擬記憶體時4g,也就是說,每個程序的頁目錄,頁表填的項,加起來是4g,但是其中從3g-4g的高位址,許可權比較高,只能在程序進入核心態的時候才能訪問,這3g-4g的對映,每個程序都是一樣的,都是來自fork時從核心執行緒copy過來的。所以程序可以在使用者態訪問,只有3g虛擬記憶體。

程序啟動時,作業系統只是為其分配了虛擬記憶體,而這些虛擬記憶體並未和物理記憶體繫結,所以,執行中,會發生缺頁中斷,這時候,作業系統需要將找到空閒物理記憶體,然後,將這個空閒物理記憶體和虛擬記憶體繫結。

由此可見,作業系統是需要有乙個結構,對所有物理記憶體進行管理的。作業系統將每4k物理記憶體作為乙個單位,叫做頁框,進行管理。

linux核心中引入了夥伴系統演算法(buddy system)。把所有的空閒頁框分組為11個塊鍊錶,每個塊鍊錶分別包含大小為1,2,4,8,16,32,64,128,256,512和1024個連續頁框的頁框塊。最大可以申請1024個連續頁框,對應4mb大小的連續記憶體。每個頁框塊的第乙個頁框的實體地址是該塊大小的整數倍。例如,大小為16個頁框的塊,其起始位址是16*2^12(2^12=4096)的整數倍。

假設要申請乙個256個頁框的塊,先從256個頁框的鍊錶中查詢空閒塊,如果沒有,就去512個頁框的鍊錶中找,找到了則將頁框塊分為2個256個頁框的塊,乙個分配給應用,另外乙個移到256個頁框的鍊錶中。如果512個頁框的鍊錶中仍沒有空閒塊,繼續向1024個頁框的鍊錶查詢。如果1024塊存在,則將其中的256頁框作為請求返回,剩餘的768分成256塊和512塊分別插到相應的鍊錶中。如果仍然沒有,則返回錯誤。

頁框塊在釋放時,會主動大小為相同的乙個空閒夥伴塊合成為2倍大小的單獨塊較大的頁框塊。兩個塊稱為夥伴需要滿足一下條件:

(1)兩個塊具有相同的大小

(2)它們的實體地址是連連續的。

(3)第一塊的第乙個頁框的實體地址是2*b*2^12的倍數。

結構如圖所示:第i個塊鍊錶中,num表示大小為(2^i)頁塊的數目,address表示大小為(2^i)頁塊的首位址。

夥伴系統,除了在缺頁中斷中,為虛擬記憶體頁分配乙個物理記憶體頁外,在linux核心中,有時候需要連續的大物理記憶體,也可以用夥伴系統。

夥伴系統管理著所有的物理記憶體,當我們需要物理記憶體時,便向它申請。假如現在核心**需要申請乙個5byte的空間,但是夥伴系統分配給我們的,至少都是4k的物理記憶體,這樣就會至少浪費了4k-5byte的空就,造成嚴重的記憶體內碎片。所以,核心需要乙個小物理記憶體分配管理器。

這個就是slab分配器。

slab分配器,其實就是向夥伴系統申請了乙個較大的物理記憶體,再把這個物理記憶體分得很小,可以分配很小的物理記憶體。

除了能夠分配小記憶體,slab分配器還可以用於物件快取,其實就是在slab分配器**記憶體時,不做其他清理操作,直接將其放回,這樣之前在這記憶體上的物件的初始化資訊還是在的,下次有這種物件申請記憶體時,直接把這個記憶體給它,這個物件獲得這個記憶體後就不需要初始化了,因為上次物件的初始化資訊依舊還在。

vmalloc和malloc其實是很像的,不過乙個在程序位址空間申請的,乙個是在核心高位址位置申請的,由上面分析,我們可以知道,這兩個申請的記憶體,都是虛擬位址上連續,而實體地址上是不連續的。

kmallo是基於slab分配器實現的,所以,其申請的位置是物理記憶體連續的。

linux核心記憶體管理

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

Linux核心 記憶體管理

在棧上靜態分配 高階記憶體的對映 分配函式的選擇 1.32位體系結構支援4kb的頁,如果1gb的物理記憶體,物理記憶體被劃分為262144個頁 2.系統中每乙個物理頁都有乙個struct page結構體 linux核心主要使用四種區 zone highem叫做高階記憶體,其餘的叫做低端記憶體 記憶體...

Linux核心記憶體

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