1. 程式人生 > 其它 >通過夥伴系統申請核心記憶體的系統的函式

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

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能對映的記憶體由原有的實體記憶體空間決定,所以沒有進行測試

參考連結:https://mp.weixin.qq.com/s/Sc8rNQYCsARF9z6n9dpgcQ