kmem_cache_destroy
內核函數 kmem_cache_destroy 用來銷毀緩存。這個調用是由內核模塊在被卸載時執行的。在調用這個函數時,緩存必須為空。
void kmem_cache_destroy( struct kmem_cache *cachep );
kmem_cache_alloc
要從一個命名的緩存中分配一個對象,可以使用 kmem_cache_alloc 函數。調用者提供了從中分配對象的緩存以及一組標志:
void kmem_cache_alloc( struct kmem_cache *cachep, gfp_t flags );
這個函數從緩存中返回一個對象。注意如果緩存目前為空,那么這個函數就會調用 cache_alloc_refill 向緩存中增加內存。 kmem_cache_alloc 的 flags 選項與 kmalloc 的 flags 選項相同。表 2 給出了標志選項的部分列表。
表 2. kmem_cache_alloc 和 kmalloc 內核函數的標志選項
標志 | 說明 |
GFP_USER | 為用戶分配內存(這個調用可能會睡眠)。 |
GFP_KERNEL | 從內核 RAM 中分配內存(這個調用可能會睡眠)。 |
GFP_ATOMIC | 使該調用強制處于非睡眠狀態(對中斷處理程序非常有用)。 |
GFP_HIGHUSER | 從高端內存中分配內存。 |
kmem_cache_zalloc
內核函數 kmem_cache_zalloc 與 kmem_cache_alloc 類似,只不過它對對象執行 memset 操作,用來在將對象返回調用者之前對其進行清除操作。
kmem_cache_free
要將一個對象釋放回 slab,可以使用 kmem_cache_free.調用者提供了緩存引用和要釋放的對象。
void kmem_cache_free( struct kmem_cache *cachep, void *objp ); |
kmalloc 和 kfree
內核中最常用的內存管理函數是 kmalloc 和 kfree 函數。這兩個函數的原型如下:
void *kmalloc( size_t size, int flags ); void kfree( const void *objp ); |
注意在 kmalloc 中,惟一兩個參數是要分配的對象的大小和一組標志(請參看 表 2 中的部分列表)。但是 kmalloc 和 kfree 使用了類似于前面定義的函數的 slab 緩存。kmalloc 沒有為要從中分配對象的某個 slab 緩存命名,而是循環遍歷可用緩存來查找可以滿足大小限制的緩存。找到之后,就(使用 __kmem_cache_alloc)分配一個對象。要使用 kfree 釋放對象,從中分配對象的緩存可以通過調用 virt_to_cache 確定。這個函數會返回一個緩存引用,然后在 __cache_free 調用中使用該引用釋放對象。
其他函數
slab 緩存 API 還提供了其他一些非常有用的函數。 kmem_cache_size 函數會返回這個緩存所管理的對象的大小。您也可以通過調用 kmem_cache_name 來檢索給定緩存的名稱(在創建緩存時定義)。緩存可以通過釋放其中的空閑 slab 進行收縮。這可以通過調用 kmem_cache_shrink 實現。注意這個操作(稱為回收)是由內核定期自動執行的(通過 kswapd)。
unsigned int kmem_cache_size( struct kmem_cache *cachep ); const char *kmem_cache_name( struct kmem_cache *cachep ); int kmem_cache_shrink( struct kmem_cache *cachep ); |
slab 緩存的示例用法
下面的代碼片斷展示了創建新 slab 緩存、從緩存中分配和釋放對象然后銷毀緩存的過程。首先,必須要定義一個 kmem_cache 對象,然后對其進行初始化(請參看清單 1)。這個特定的緩存包含 32 字節的對象,并且是硬件緩存對齊的(由標志參數 SLAB_HWCACHE_ALIGN 定義)。