初探Linux核心中的記憶體管理

2022-09-17 14:54:11 字數 1742 閱讀 9606

初探linux核心管理

核心本身不像使用者空間那樣奢侈的使用記憶體;

核心是如何管理記憶體?

什麼是記憶體管理單元(mmu) -- 就是把虛擬位址轉換為實體地址的硬體; 那什麼是虛擬位址呢?

高階記憶體並不永久的對映到核心位址空間上, 什麼是高階記憶體?

核心用page資料結構來描述當前時刻在相關物理記憶體中存放的東西;

每乙個物理頁都對應乙個page結構體

區的概念?

核心必須處理兩種情況(由硬體缺陷引起的)

四種不同的分割槽

區的實際分布和使用和體系結構相關

linux把系統的頁劃分為區, 形成不同的記憶體池, 根據不同的用途進行分配;

區的劃分沒有任何物理意義, 只是核心為了管理頁而採取的一種邏輯上的分組;

64位機上的zone結構體有乙個自旋鎖, 它防止該結構體被併發訪問;

核心提供了一種請求記憶體的底層機制, 並提供了對它的訪問介面;

如果以位元組為單位分配記憶體, 直接呼叫核心函式kmalloc就可以了, 返回的是連續的實體地址;

分配器標誌-gfp_mask標誌

vmalloc也是以位元組為單位分配記憶體, 但它與kmalloc不同的是, 分配的記憶體虛擬位址是連續的, 實體地址不一定是連續的;

什麼時候用vmalloc, 獲得大記憶體塊時, 模組動態地插入到核心中, 把模組裝載到由vmalloc分配的記憶體上;

vmalloc函式可能會睡眠, 不能在中斷上下文進行呼叫;

slab 層(slab分配器, )

slab分配器扮演了通用資料結構快取層的角色;

smp(對稱多處理結構)鎖

slab層把不同的物件劃分為快取記憶體組, 每個快取組存放不同型別的物件;

inode結點是磁碟索引節點在記憶體中的體現, 會頻繁的建立和釋放, 用slab來管理inode節點;

快取記憶體 >> slab >> 具體物件

slab的管理是在每個快取記憶體的基礎上, 並提供核心乙個簡單的介面;

要理解slab層的具體實現;

slab分配器的介面

釋放乙個物件 -- kmem_cache_free;

程序描述符是核心的核心組成部分;

slab層負責記憶體緊缺情況下所有底層的對齊, 著色, 分配, 和**等;

如果要頻繁的建立很多相同型別的物件, 應該考慮使用slab快取記憶體, 不要自己去實現空閒鍊錶;

在棧上的靜態分配

核心棧小而固定, 給每個程序分配乙個固定大小的小棧後, 不但可以減少記憶體的消耗, 而且核心也無需負擔太重的棧管理任務;

隨著機器執行時間的增加, 尋找兩個未分配的, 連續的頁變得越來越困難, 記憶體漸漸變成碎片, 因此給乙個新程序分配乙個虛擬記憶體(vm)的壓力也在增大;

中斷棧: 中斷棧為每個程序提供乙個用於中斷處理程式的棧;

核心棧可以是一頁, 也可以是兩頁, 所以棧的大小為4~16kb;

再具體的函式中, 讓所有區域性變數(即所謂的自動變數)所佔空間之和不要超過幾百位元組;

在棧上進行大量的靜態分配是很危險的(分配大型陣列或者大型結構體);

高階記憶體的對映

kunmap解除對映;

臨時對映

每個cpu的分配

smp(對稱多處理器)的現代作業系統使用每個cpu上的資料, 對於給定的處理器其資料是唯一的

新的每個cpu介面

編譯時定義每個cpu資料

編譯時每個cpu資料的例子並不能在模組內使用, 因為鏈結程式實際上將他們建立在乙個唯一的可執行段中(.data.percpu)

分配函式的選擇

Linux 核心中斷體系 初探

還是要先理解整個中斷的體系,首先要理解對中斷的含義 如果這是涉及到的軟體的除錯的話,沒有接觸過硬體的同學會對,gdb的除錯中的中斷有一定的認知 但是,這兩個中斷指的意思是不相同的,gdb的除錯中的中斷 指的是程式執行到某個節點的的時候就跳出程式,這個 節點指的是提前設定好的中斷點,而這個linux ...

Linux核心中的記憶體屏障

編譯器有時會對 做一些優化,例如嘗試在保證程式執行正確的前提下修改指令順序或優化ldr str指令,讓程式執行地更快。但是編譯器畢竟不能完全猜透人的心思,有時候它做的優化會導致程式執行不符我們的預期。因此,核心中提供了一些額外的函式,可以插在某段 裡,告訴編譯器不要在這裡做指令優化。這些函式分為兩種...

Linux核心中記憶體分配函式

1.原理說明 linux核心中採 用了一種同時適用於32位和64位系統的內 存分頁模型,對於32位系統來說,兩級頁表足夠用了,而在x86 64系 統中,用到了四級頁表,如圖2 1所示。四級頁表分別為 頁全域性目錄 page global directory 頁上級目錄 page upper dire...