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描述符,以及对象描述符都没有进行初始化。
- 1423 sizes[INDEX_AC].cs_cachep = kmem_cache_create(names[INDEX_AC].name,
-
1424 sizes[INDEX_AC].cs_size,
-
1425 ARCH_KMALLOC_MINALIGN,
-
1426 ARCH_KMALLOC_FLAGS|SLAB_PANIC,
-
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);
阅读(1828) | 评论(0) | 转发(0) |