通過夥伴系統申請核心記憶體的系統的函式

2022-10-08 00:09:22 字數 992 閱讀 3808

a、內在分配有兩類演算法:

1、夥伴系統 

2、slab機制

b、常用記憶體分配函式

__get_free_pages

__get_free_pages函式是最原始的記憶體分配方式,直接從夥伴系統中獲取原始頁框,返回值為第乙個頁框的起始位址。

kmem_cache_alloc

是基於slab分配器的一種記憶體分配方式,適用於反覆分配釋放同一大小記憶體塊的場合

kmalloc

kmalloc是核心中最常用的一種記憶體分配方式,它通過呼叫kmem_cache_alloc 函式來實現。kmalloc一次最多能申請的記憶體大小由

include/linux/kmalloc_size.h的內容來決定

其中kmalloc有kzalloc & devm_kzalloc 

kzalloc()實現了kmalloc()+memset()的功能。devm_kzalloc 是具有資源管理的 kzalloc()。使用資源管理(resource-managed)函式分配的記憶體,是會與所屬裝置相關聯。當裝置從系統中分離或者裝置驅動被解除安裝,該記憶體會被自動釋放。也可以通過devm_kfree()來釋放記憶體

vmalloc

但是在某些場合中,對記憶體區的請求不是很頻繁,較高的記憶體訪問時間也可以接受,這是就可以分配一段線性連續,物理不連續的位址,帶來的好處是一次可以分配較大塊的記憶體

dma_alloc_coherent

dma是一種硬體機制,允許外圍裝置和主存之間直接傳輸io資料,而不需要 cpu的參與,使用dma機制能大幅提高與裝置通訊的吞吐量

ioremap

ioremap是一種更直接的記憶體「分配」方式,使用時直接指定物理起始位址和 需要分配記憶體的大小,然後將該段物理位址對映到核心位址空間。ioremap用到的實體地址空間都是事先確定的,和上面的幾種記憶體 分配方式並不太一樣,並不是分配一段新的物理記憶體。ioremap多用於裝置驅動,可以讓cpu直接訪問外部裝置的io空間。ioremap能對映的記憶體由原有的物理記憶體空間決定,所以沒有進行測試

linux底層記憶體管理 核心空間的夥伴系統

linux核心的夥伴演算法最大限度的減少了記憶體的碎片,其實應該說成是盡自己最大的努力減少了記憶體 的碎片。其思想就是將物理記憶體分成10個鍊錶,每乙個鍊錶的元素代表一系列的連續頁面,連續頁面的數量隨鍊錶的不同而不同,linux中有10個這樣的鏈 表,按照2的從0到9次冪的連續頁面數量組成,比如鍊錶...

核心記憶體的分配

當使用者態程序需要額外記憶體的時候,可以從核心所維護的空閒頁幀鍊錶中獲取頁,該鍊錶通常由頁替換演算法來更新,這些頁幀通常分散在物理記憶體當中,如果使用者只需要乙個位元組的記憶體,那麼會產生記憶體碎片,這是因為程序會得到整個頁幀 核心記憶體的分配通常是從空閒記憶體池中獲取的,而並不是從滿足普通使用者模...

Linux核心記憶體管子系統分析

還是那張熟悉的老圖 linux核心子系統簡介 由七個部分組成 linux記憶體管理模型 1.記憶體管子系統職能 1 管理虛擬位址與實體地址的對映 2 管理物理記憶體的分配 2.位址對映管理 linux採用的是一種虛擬位址的管理方式,對於乙個32位的處理器對於的記憶體空間為4g,其中0到3g是使用者空...