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無論如何都要配置成功

results matching ""

    No results matching ""