初探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...