Chinaunix首页 | 论坛 | 博客
  • 博客访问: 232910
  • 博文数量: 37
  • 博客积分: 933
  • 博客等级: 军士长
  • 技术积分: 511
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-16 10:15
文章分类
文章存档

2012年(1)

2011年(36)

分类: LINUX

2011-03-21 10:29:06

1) kmem_list3 全局变量
2) cache_cache 静态全局变量
3) array_cache 静态全局变量
这些变量是我们在cache_cache建立期间所需要手动填充的数据。

811 static void cache_estimate(unsigned long gfporder, size_t buffer_size,
812                            size_t align, int flags, size_t *left_over,
 813                            unsigned int *num)
 814 {
 815         int nr_objs;
 816         size_t mgmt_size;
 817         size_t slab_size = PAGE_SIZE << gfporder;
834         if (flags & CFLGS_OFF_SLAB) {
 835                 mgmt_size = 0;
 836                 nr_objs = slab_size / buffer_size;
 837
 838                 if (nr_objs > SLAB_LIMIT)
 839                         nr_objs = SLAB_LIMIT;
 840         } else {
849                 nr_objs = (slab_size - sizeof(struct slab)) /
 850                           (buffer_size + sizeof(kmem_bufctl_t));
856                 if (slab_mgmt_size(nr_objs, align) + nr_objs*buffer_size
 857                        > slab_size)
 858                         nr_objs--;
 859
 860                 if (nr_objs > SLAB_LIMIT)
 861                         nr_objs = SLAB_LIMIT;
863                 mgmt_size = slab_mgmt_size(nr_objs, align);
 864         }
 865         *num = nr_objs;
 866         *left_over = slab_size - nr_objs*buffer_size - mgmt_size;
 867 }
这个函数非常简单:算出该SLAB包含的对象数,并求出剩余的空间,注意由于此时我们还处在kmem_cache_init阶段,所以CFLGS_OFF_SLAB标志是为0的,也就是说第一个高速函数的slab描述符以及对象描述符是包含在slab内部的。
经过cache_estimate这个函数过后,我们就把cache_cache描述符填充完成了,同时我们也假象出了我们所需要的cache_cache形式。
 

注意此时只有cache_cache描述符是被初始化完成的,其余的都还有没有进行初始化,包括slab所需页框没有被分配,对象 array_cache数组缓存,slab描述符,以及对象描述符都没有进行初始化。
  1. 1423 sizes[INDEX_AC].cs_cachep = kmem_cache_create(names[INDEX_AC].name,
  2. 1424 sizes[INDEX_AC].cs_size,
  3. 1425 ARCH_KMALLOC_MINALIGN,
  4. 1426 ARCH_KMALLOC_FLAGS|SLAB_PANIC,
  5. 1427 NULL, NULL);
上面代码创建了第二个高速缓存,这个高速缓存的名字为"size-32"注:在这里我们假设sizeof(struct ))小于等于32bytes。为什么说是第二个高速缓存呢,因为第一个是cache_cache,同时我们也知道当初在创建cache_cache的对象(上图的OBJ)时,其大小就是按照kmem_cache算的,所以第一个高速缓存的对象内容就是以后所有的高速缓存描述符。在我们创建第二个高速缓存的时候,首先为cache_cache高速缓存分配页框,进行对上述图片中的slab描述符 对象描述符进行初始化。

实际上上面的函数所对应的函数为:kmem_cache_create(
“size-32”,32,
ARCH_KMALLOC_MINALIGN,ARCH_KMALLOC_FLAGS|SLAB_PANIC,0,0);

阅读(1852) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~