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