kmalloc
kmalloc用法跟malloc非常相似,它的速度很快,因為它不會清理所配置到的記憶體,也就是說記憶體仍保有先前留下的內容。此外利用kmalloc所得到的記憶空間,在實體記憶體上是連續的,因此它偶爾會出現停頓(blocking),如果當時沒有足夠的連續的記憶體可以配置。
flag引數
void kmalloc(size_t size,int flags);
kmalloc()第一個引數,是欲配置的區塊的容量,第二個引數是要配置的旗標(allocating flags)它控制了kmalloc的行為。我們最常用的是GFP_KERNEL與GFP_ATOMIC兩個。
GFP_KERNEL
一般的核心記憶體配置。有可能休眠。
GFP_ATOMIC
用於interrupt handler或任何行程外環境的程式。絕不休眠。
GFP_USER
配置記憶體給user-space行程。有可能休眠
GFP_HIGHUSER
類似GFP_USER,但是從高址區(high memory)取得可用空間。
GFP_NOIO
GFP_NOFS
這些旗標類似GFP_KERNEL,但有些功能限制。GFP_NOFS 不容許任何檔案系統呼叫,GFP_NOIO則禁止觸發任何I/O作業。
__GFP_DMA
配置可供DMA傳輸的記憶體。其實際意義隨平台而異。
__GFP_HIGHMEM
要求配置高址區記憶體
__GFP_COLD
配置閒置的記憶體空間
__GFP_NOWARN
可避免核心在無法配置要求時,發出警告訊息。
__GFP_HIGH
要求核心不計代價滿足配置要求
__GFP_NORETRY
__GFP_REPEAT
__GFP_NOFAIL
GFP_NORETRY要求無法獲得足夠記憶體就放棄 GFP_REPEAT再試一次就好 __GFP_NOFAIL無論如何都要配置成功