原文地址:http://bbs.chinaunix.net/thread-2020986-1-1.html 
 

最近看了一下slab的内容。简单写了个结构分析。

大家看看。

这里先感谢一下 hyl 和 Eric Xiao的帮助。


下面是正文:


主要数据结构:

struct kmem_cache_s {
/* 1) per-cpu data, touched during every alloc/free */
        struct array_cache        *array[NR_CPUS];
        unsigned int                batchcount;
        unsigned int                limit;
/* 2) touched by every alloc & free from the backend */
        struct kmem_list3        lists;
        /* NUMA: kmem_3list_t        *nodelists[MAX_NUMNODES] */
        unsigned int                objsize;
        unsigned int                 flags;        /* constant flags */
        unsigned int                num;        /* # of objs per slab */
        unsigned int                free_limit; /* upper limit of objects in the lists */
        spinlock_t                spinlock;

/* 3) cache_grow/shrink */
        /* order of pgs per slab (2^n) */
        unsigned int                gfporder;

        /* force GFP flags, e.g. GFP_DMA */
        unsigned int                gfpflags;

        size_t                        colour;                /* cache colouring range */
        unsigned int                colour_off;        /* colour offset */
        unsigned int                colour_next;        /* cache colouring */
        kmem_cache_t                *slabp_cache;
        unsigned int                slab_size;
        unsigned int                dflags;                /* dynamic flags */

        /* constructor func */
        void (*ctor)(void *, kmem_cache_t *, unsigned long);

        /* de-constructor func */
        void (*dtor)(void *, kmem_cache_t *, unsigned long);

/* 4) cache creation/removal */
        const char                *name;
        struct list_head        next;

/* 5) statistics */
#if STATS
        unsigned long                num_active;
        unsigned long                num_allocations;
        unsigned long                high_mark;
        unsigned long                grown;
        unsigned long                reaped;
        unsigned long                 errors;
        unsigned long                max_freeable;
        unsigned long                node_allocs;
        atomic_t                allochit;
        atomic_t                allocmiss;
        atomic_t                freehit;
        atomic_t                freemiss;
#endif
#if DEBUG
        int                        dbghead;
        int                        reallen;
#endif
};


struct slab {
        struct list_head        list;
        unsigned long                colouroff;
        void                        *s_mem;                /* including colour offset */
        unsigned int                inuse;                /* num of objs active in slab */
        kmem_bufctl_t                free;
};


struct kmem_list3 {
        struct list_head        slabs_partial;        /* partial list first, better asm code */
        struct list_head        slabs_full;
        struct list_head        slabs_free;
        unsigned long        free_objects;
        int                free_touched;
        unsigned long        next_reap;
        struct array_cache        *shared;
};




cache由 kmem_cache_t(struct kmem_cache_s) 来描述.
slab 由 struct slab 来描述
objec 由 kmem_bufctl_t 来描述



所有的kmem_cache_t 组成链表 cache_chain.该链表由信号量 cache_chain_sem来进行访问保护:
static struct semaphore        cache_chain_sem;
static struct list_head cache_chain;

cache_chain 的第一个高速缓存是 cache_cache. 可以从名字看出来,这个是缓存的缓存.也就是说它存储的是其它缓存的缓存描述符.

高速缓存分为general 和 specific 两种.

对于general的高速缓存,就是cache_cache 和 13个 kmalloc caches.
其中这13个kmalloc caches 的大小呈几何分布:32,64, 128, ... 他们在malloc_sizes表中定义.

specific 的高速缓存是由kmem_cache_create()来创建的.

在内核启动的时候,初始化函数kmem_cache_init()来初始化cache_chain. 实际上它创建了general的高速缓存并初始化相应的内容.

整个的cache_chain的情形如下图所示:

相关文章:

  • 2021-07-25
  • 2021-11-19
  • 2022-12-23
  • 2021-08-14
  • 2021-04-01
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-01-17
  • 2022-12-23
  • 2021-04-19
  • 2022-12-23
相关资源
相似解决方案