现在的位置: 首页 > 综合 > 正文

浅析linux内核内存管理之kmalloc

2013年05月29日 ⁄ 综合 ⁄ 共 1580字 ⁄ 字号 评论关闭

在SLAB的高速缓存中有普通高速缓存和专用高速缓存,平时用kmem_cache_create创建的是专用高速缓存,比如存放task_struct,mm_struct的高速缓存。普通高速缓存主要供kmalloc使用。第一个高速缓存叫kmem_cache,存放在cache_cache变量中,这个cache专门用于为其他cache分配描述符。

  1. static kmem_cache_t cache_cache = {  
  2.     .lists      = LIST3_INIT(cache_cache.lists),  
  3.     .batchcount = 1,  
  4.     .limit      = BOOT_CPUCACHE_ENTRIES,  
  5.     .objsize    = sizeof(kmem_cache_t),  
  6.     .flags      = SLAB_NO_REAP,  
  7.     .spinlock   = SPIN_LOCK_UNLOCKED,  
  8.     .name       = "kmem_cache",  
  9. #if DEBUG  
  10.     .reallen    = sizeof(kmem_cache_t),  
  11. #endif  
  12. };  

内存区大小的范围一般包括13个几何分布的内存区。一个叫做malloc_sizes的表(其元素类型为cache_sizes)分别指向26个高速缓存描述符,与其相关的内存区大小为32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072。

  1. struct cache_sizes malloc_sizes[] = {  
  2. #define CACHE(x) { .cs_size = (x) },  
  3. #include <linux/kmalloc_sizes.h>  
  4.     { 0, }  
  5. #undef CACHE  
  6. };  

下面是kmalloc()的实现,kernel 2.6.11:

  1. static inline void *kmalloc(size_t size, int flags)  
  2. {  
  3.         if (__builtin_constant_p(size)) {  
  4.                 int i = 0;  
  5. #define CACHE(x) \  
  6.                 if (size <= x) \  
  7.                         goto found; \  
  8.                 else \  
  9.                         i++;  
  10. #include "kmalloc_sizes.h"  
  11. #undef CACHE  
  12.                 {  
  13.                         extern void __you_cannot_kmalloc_that_much(void);  
  14.                         __you_cannot_kmalloc_that_much();  
  15.                 }  
  16. found:  
  17.                 return kmem_cache_alloc((flags & GFP_DMA) ?  
  18.                         malloc_sizes[i].cs_dmacachep :  
  19.                         malloc_sizes[i].cs_cachep, flags);  

抱歉!评论已关闭.