在SLAB的高速缓存中有普通高速缓存和专用高速缓存,平时用kmem_cache_create创建的是专用高速缓存,比如存放task_struct,mm_struct的高速缓存。普通高速缓存主要供kmalloc使用。第一个高速缓存叫kmem_cache,存放在cache_cache变量中,这个cache专门用于为其他cache分配描述符。
- static kmem_cache_t cache_cache = {
- .lists = LIST3_INIT(cache_cache.lists),
- .batchcount = 1,
- .limit = BOOT_CPUCACHE_ENTRIES,
- .objsize = sizeof(kmem_cache_t),
- .flags = SLAB_NO_REAP,
- .spinlock = SPIN_LOCK_UNLOCKED,
- .name = "kmem_cache",
- #if DEBUG
- .reallen = sizeof(kmem_cache_t),
- #endif
- };
内存区大小的范围一般包括13个几何分布的内存区。一个叫做malloc_sizes的表(其元素类型为cache_sizes)分别指向26个高速缓存描述符,与其相关的内存区大小为32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072。
- struct cache_sizes malloc_sizes[] = {
- #define CACHE(x) { .cs_size = (x) },
- #include <linux/kmalloc_sizes.h>
- { 0, }
- #undef CACHE
- };
下面是kmalloc()的实现,kernel 2.6.11:
- static inline void *kmalloc(size_t size, int flags)
- {
- if (__builtin_constant_p(size)) {
- int i = 0;
- #define CACHE(x) \
- if (size <= x) \
- goto found; \
- else \
- i++;
- #include "kmalloc_sizes.h"
- #undef CACHE
- {
- extern void __you_cannot_kmalloc_that_much(void);
- __you_cannot_kmalloc_that_much();
- }
- found:
- return kmem_cache_alloc((flags & GFP_DMA) ?
- malloc_sizes[i].cs_dmacachep :
- malloc_sizes[i].cs_cachep, flags);