標籤:
在應用程式中,常使用malloc函數進行動態記憶體分配,而在Linux核心中,通常使用kmalloc來動態分配記憶體。
kmalloc 原型是:
#include <linux/slab.h>
void *kmalloc(size_t size, int flags)
參數:
size:要分配的記憶體大小。
flags:分配標誌, 它控制 kmalloc 的行為。
1、最常用的標誌是GFP_KERNEL(內部最終通過調用 __get_free_pages 來進行, 它是 GFP_ 首碼的來源),它的意思是該記憶體配置是由運行在核心態的進程調用的。
也就是說,調用它的函數屬於某個進程的,當空閑記憶體太少時,kmalloc函數會使當前進程進入睡眠,等待空閑頁的出現。
2、如果kmalloc是在進程上下文之外調用,比如在中斷處理,任務隊列處理和核心定時器處理中。這些情況屬於中斷上下文,不能進入睡眠,
這時應該使用優先權GFP_ATOMIC。
3、GFP_ATOMIC
用來在進程上下文之外的代碼(包括中斷處理)中分配記憶體,從不睡
眠。
4、GFP_KERNEL
進程上下文中的分配。可能睡眠。(16M-896M)
5、__GFP_DMA
這個標誌要求分配能夠 DMA 的記憶體區(物理地址在16M以下的頁
幀 )
6、__GFP_HIGHMEM
這個標誌表示分配的記憶體位於高端記憶體。(896M以上)
用kfree函數來釋放kmalloc分配的記憶體
如果模組需要分配大塊的記憶體,那使用面向頁的分配技術會更好
get_zeroed_page(unsigned int flags)
返回指向新頁面的指標,並將分頁清空。
__get_free_page(unsigned int flags)
和get_free_page類似,但不清零頁面。
__get_free_pages(unsigned int flags,unsigned int order )
分配若干個連續的頁面,返回指向該記憶體地區的指標,但也不清零這段記憶體地區。
當程式用完這些頁, 可以使用下列函數之一來釋放它們:
void free_page(unsigned long addr)
void free_pages(unsigned long addr, unsigned
long order)
如果釋放的和先前分配數目不等的頁面,會導致系統錯誤
核心記憶體配置