我們都知道在用戶空間動態(tài)申請內存用的函數是 malloc(),這個函數在各種操作系統(tǒng)上的使用是一致的,對應的用戶空間內存釋放函數是 free()。注意:動態(tài)申請的內存使用完后必須要釋放,否則會造成內存泄漏,如果內存泄漏發(fā)生在內核空間,則會造成系統(tǒng)崩潰。
那么,在內核空間中如何申請內存呢?一般我們會用到 kmalloc()、kzalloc()、vmalloc() 等,下面我們介紹一下這些函數的使用以及它們之間的區(qū)別。
kmalloc()
函數原型:
void *kmalloc(size_t size, gfp_t flags);
kmalloc() 申請的內存位于物理內存映射區(qū)域,而且在物理上也是連續(xù)的,它們與真實的物理地址只有一個固定的偏移,因為存在較簡單的轉換關系,所以對申請的內存大小有限制,不能超過128KB。
較常用的 flags(分配內存的方法):
GFP_ATOMIC —— 分配內存的過程是一個原子過程,分配內存的過程不會被(高優(yōu)先級進程或中斷)打斷;
GFP_KERNEL —— 正常分配內存;
GFP_DMA —— 給 DMA 控制器分配內存,需要使用該標志(DMA要求分配虛擬地址和物理地址連續(xù))。
flags 的參考用法:
|– 進程上下文,可以睡眠GFP_KERNEL |– 進程上下文,不可以睡眠GFP_ATOMIC ||– 中斷處理程序GFP_ATOMIC ||– 軟中斷GFP_ATOMIC ||– TaskletGFP_ATOMIC |– 用于DMA的內存,可以睡眠GFP_DMA | GFP_KERNEL |– 用于DMA的內存,不可以睡眠GFP_DMA |GFP_ATOMIC
對應的內存釋放函數為:
void kfree(const void *objp);
kzalloc()
kzalloc() 函數與 kmalloc() 非常相似,參數及返回值是一樣的,可以說是前者是后者的一個變種,因為 kzalloc() 實際上只是額外附加了__GFP_ZERO標志。所以它除了申請內核內存外,還會對申請到的內存內容清零。
/** * kzalloc - allocate memory. The memory is set to zero. * @size: how many bytes of memory are required. * @flags: the type of memory to allocate (see kmalloc). */static inline void *kzalloc(size_t size, gfp_t flags){ return kmalloc(size, flags | __GFP_ZERO);}
kzalloc() 對應的內存釋放函數也是 kfree()。
vmalloc()
函數原型:
void *vmalloc(unsigned long size);
vmalloc() 函數則會在虛擬內存空間給出一塊連續(xù)的內存區(qū),但這片連續(xù)的虛擬內存在物理內存中并不一定連續(xù)。由于 vmalloc() 沒有保證申請到的是連續(xù)的物理內存,因此對申請的內存大小沒有限制,如果需要申請較大的內存空間就需要用此函數了。
對應的內存釋放函數為:
void vfree(const void *addr);
注意:vmalloc() 和 vfree() 可以睡眠,因此不能從中斷上下文調用。
總結
kmalloc()、kzalloc()、vmalloc() 的共同特點是:
用于申請內核空間的內存;
內存以字節(jié)為單位進行分配;
所分配的內存虛擬地址上連續(xù);
kmalloc()、kzalloc()、vmalloc() 的區(qū)別是:
kzalloc 是強制清零的 kmalloc 操作;(以下描述不區(qū)分 kmalloc 和 kzalloc)
kmalloc 分配的內存大小有限制(128KB),而 vmalloc 沒有限制;
kmalloc 可以保證分配的內存物理地址是連續(xù)的,但是 vmalloc 不能保證;
kmalloc 分配內存的過程可以是原子過程(使用 GFP_ATOMIC),而 vmalloc 分配內存時則可能產生阻塞;
kmalloc 分配內存的開銷小,因此 kmalloc 比 vmalloc 要快;
一般情況下,內存只有在要被 DMA 訪問的時候才需要物理上連續(xù),但為了性能上的考慮,內核中一般使用 kmalloc(),而只有在需要獲得大塊內存時才使用 vmalloc()。例如,當模塊被動態(tài)加載到內核當中時,就把模塊裝載到由 vmalloc() 分配的內存上。
審核編輯:符乾江
-
內存
+關注
關注
8文章
2979瀏覽量
73824 -
函數
+關注
關注
3文章
4285瀏覽量
62333 -
malloc
+關注
關注
0文章
52瀏覽量
64
發(fā)布評論請先 登錄
相關推薦
評論