Systemy Operacyjne : Pamięć : Przydział pamięci na potrzeby jądra kmalloc

Łukasz Bolikowski


Poniżej przedstawione są najważniejsze pola trzech struktur danych: kmem_cache_t (opisującej schowek), kmem_slab_t (opisującej taflę) i cache_sizes_t (specjalnie dla tablicy cache_sizes).


struct kmem_cache_s {
	struct list_head  slabs;
	struct list_head  *firstnotfull;
	unsigned int      objsize;
	unsigned int      flags;
	unsigned int      num;
	spinlock_t        spinlock;
#ifdef CONFIG_SMP
	unsigned int      batchcount;
#endif
	unsigned int      gfporder;
	unsigned int      gfpflags;
	size_t            colour;
	unsigned int      colour_off;
	unsigned int      colour_next;
	kmem_cache_t      *slabp_cache;
	unsigned int      growing;
	unsigned int      dflags;
	void (*ctor)(void *, kmem_cache_t *, unsigned long);
	void (*dtor)(void *, kmem_cache_t *, unsigned long);
	unsigned long     failures;
	char              name[CACHE_NAMELEN];
	struct list_head  next;
#ifdef CONFIG_SMP
	cpucache_t        *cpudata[NR_CPUS];
#endif
};

typedef struct kmem_cache_s kmem_cache_t;

typedef struct slab_s {
	struct list_head  list;
	unsigned long     colouroff;
	void              *s_mem;
	unsigned int      inuse;
	kmem_bufctl_t     free;
} slab_t;

typedef struct cache_sizes {
	size_t            cs_size;
	kmem_cache_t      *cs_cachep;
	kmem_cache_t      *cs_dmacachep;
} cache_sizes_t;

Interesować nas też będą dwie zmienne:


static kmem_cache_t cache_cache = {
	slabs:         LIST_HEAD_INIT(cache_cache.slabs),
	firstnotfull:  &cache_cache.slabs,
	objsize:       sizeof(kmem_cache_t),
	flags:         SLAB_NO_REAP,
	spinlock:      SPIN_LOCK_UNLOCKED,
	colour_off:    L1_CACHE_BYTES,
	name:          "kmem_cache",
};

static cache_sizes_t cache_sizes[] = {
#if PAGE_SIZE == 4096
	{    32, NULL, NULL},
#endif
	{    64, NULL, NULL},
	{   128, NULL, NULL},
	...
	{131072, NULL, NULL},
	{     0, NULL, NULL}
};
Jak widać, początkowo wskaźniki do schowków zawierają wartość NULL. To normalne: pola te zostaną wypełnione dopiero przy inicjowaniu zarządzania pamięcią (funkcja kmem_cache_sizes_init).

© 2001 Łukasz Bolikowski, Jakub Górski, Jakub Kowalski, Janusz Kuligowski, Tomasz Szymko