Linux核心之記憶體管理

2021-09-19 23:31:17 字數 2212 閱讀 3250

1、核心把物理頁作為記憶體管理的基本單位(處理器的最小可定址單位一般為字),記憶體管理單元(mmu,管理記憶體並把虛擬位址轉換為實體地址的硬體)通常以頁為單位進行處理

2、不同體系結構支援的頁大小不盡相同,有些還支援多種,大多數32體系結構支援4kb的頁,64位體系結構一般支援8kb頁

3、核心用struct page結構表示系統中的每個物理頁,該結構對頁的描述是這暫時的(被交換、臨時對映),核心僅僅用這個結構描述當前時刻在相關的物理頁中存放的東西,這個結構目的用於描述物理記憶體本身,並不包含其中的資料,系統中的每個物理頁都要分配乙個這樣的結構體

由於頁位於記憶體中特定實體地址上而不能用於一些特定任務,核心把頁劃分為不同的區,使用區對具有相似特性的頁進行分組

linux主要使用四種區

區的實際使用和分布與體系結構相關,可按特定的體系結構規定進行處理。x86-32上zone_normal的範圍16mb~896mb,x86-64沒有zone_highmem區

linux把系統的頁劃分為區,形成不同的記憶體池,就可以根據用途進行分配了,區的劃分沒有任何物理意義,只不過是核心為了管理頁而採取得一種邏輯分組,每個區都用struct zone表示

以下只寫了函式名

alloc_pages()

;//分配連續的物理頁

page_address()

;//把給定頁轉為邏輯位址

__get_free_pages()

;//返回第一頁的邏輯位址

alloc_page()

;//分配一頁

__get_free_page()

;//返回頁邏輯位址

get_zeroed_page()

;//返回填充0的頁

_free_pages()

;//釋放頁需要謹慎,用錯可能導致系統崩潰

free_pages()

;free_page()

;

核心分配可能失敗,因此程式開始時先進行記憶體分配是很有意義的

kmalloc()

;//獲取以位元組為單位的一塊核心記憶體,所分配記憶體區在物理上是連續的

kfree()

;vmalloc()

;//分配的實體地址無須連續,只確保頁在虛擬位址空間內連續的,效能上的考慮,只有在不得以的時候才會使用,比如獲取大塊記憶體

vfree()

;//這兩個函式都可睡眠,小心使用

一般只有硬體裝置需要用到實體地址連續的記憶體,軟體使用的記憶體塊就可以使用只有虛擬位址連續的記憶體塊

可分為三類

一般使用型別標誌

為了便於資料的頻繁分配和**,常會用到空閒鍊錶,它包含可供使用的,已經分配好的資料結構塊,空閒鍊錶相當於物件快取記憶體

slab分配器的幾個基本原則:

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

slab由乙個或多個物理上連續的頁組成,每個快取記憶體可以由多個slab組成,每個slab處於三種狀態之一:,滿、部分滿、空,每個快取記憶體使用kmem_cache結構表示,每個slab使用struct slab描述

當建立了乙個快取記憶體後,slab層就是乙個專用的分配器,可以為具體的物件型別進行分配,slab層負責記憶體緊缺情況下所有底層的對齊、著色、分配、釋放、**等,如果需要頻繁建立很多相同型別的物件,可以使用slab快取記憶體實現

核心棧小而且固定,1頁大小或2頁大小,與體系結構和配置選項有關,核心沒有在管理核心棧上做足工作,當棧溢位時,是很危險的,進行動態分配是更好的選擇

在高階記憶體頁不能永久地對映到核心位址空間上

kmap()

;//在高階記憶體或低端記憶體上都能用,如果頁位於高階記憶體,會建立乙個永久對映,函式可睡眠,只能用於程序上下文中

kunmap()

;//解除對映

kmap_atomic()

;//當必須建立乙個對映到當前上下文又不能睡眠時,需要使用臨時對映(原子對映)

kunmap_atomic()

;//不會阻塞

支援smp的現代作業系統使用每個cpu上的資料,對於給定的處理器其資料是唯一的,需要確保本地處理器只會訪問它的唯一資料,系統本身不保證

核心搶占會引起**被其它處理器搶占並呼叫,另乙個任務搶占了**,發生併發訪問等問題,這時如果通過獲取當預處理器號,對核心搶占進行禁止,重新啟用當預處理器號,使用這種方法就可以保護資料安全

使用每個cpu資料的好處:(需要禁止核心搶占)

linux核心學習筆記之記憶體管理

linux核心把物理頁作為記憶體管理的基本單位。每一頁的大小根據系統架構不同有所區別,32位系統下為4kb,64位系統下為8kb。記憶體管理單元 mmu 以頁為單位來管理系統中的頁表,負責虛擬位址到實體地址的轉換,使用者所使用的記憶體位址一般都是虛擬位址。核心中頁的結構體中比較重要的成員為 stru...

Linux 核心原理之記憶體系統

虛擬位址空間 實體地址空間 程序向核心申請記憶體需要位址連續的記憶體塊,linux如何處理來盡可能保持記憶體塊的連續的呢?答案buddy system。來看下buddy system記憶體位址分配策略。首先假設系統一開始有共16個位元組的記憶體,然後被分出去8 byte。狀態圖如下 可以看到左邊陣列...

linux 核心學習之記憶體管理 未完待續

1 相關概念 mmu mmu是memory management unit的縮寫,中文名是 記憶體管理 單元,它是 處理器 cpu 中用來管理 虛擬儲存器 物理儲存器的控制線路,同時也負責 虛擬位址 對映為實體地址 以及提供硬體機制的記憶體訪問授權。頁 記憶體管理 物理頁 的基本單位 mmu通常以頁...