九:几点补充: 1: slab中使用的页面都会加上“PG_slab”标志,以跟一般的页面区别。另外,在释放内存的时候,经常需要用到从页面到slab的对应转换关系。那是怎样标识的呢? 关于标志: 注意有以下代码: static void *kmem_getpages(kmem_cache_t *cachep, int flags, int nodeid) { …… while (i--) { //为分得的每一个页面设置PG_slab标志 SetPageslab(page); page++; } …… } 关于...
七:kmem_cache_free()的实现 kmem_cache_free用于把从slab中分配的对象释放掉,同分配一样,它首先会把它放到AC中,如果AC满了,则把对象释放到share链中,如果share也满了,也就把它释放至slab。来看具体的代码: void kmem_cache_free (kmem_cache_t *cachep, void *objp) { unsigned long flags; local_irq_save(flags); __cache_free(cachep, objp); local_irq_restore(flags); } 函数调用__cache_fr...
六:kmem_cache_alloc的实现分析: 我们在上面可以看到,创建一个cache描述符的时候,并没有这之分配slab数据。现在我们来看一下怎么从cache中申请对象 void * kmem_cache_alloc (kmem_cache_t *cachep, int flags) { return __cache_alloc(cachep, flags); } 实际上会调用__cache_alloc 如下: static inline void * __cache_alloc (kmem_cache_t *cachep, int flags) { unsigned long save_flags; void* objp; ...
五:kmem_cache_create()分析 我们以一个例子来跟踪分析一下slab的机制: 下面是一个测试模块的代码: #include #include #include MODULE_LICENSE("GPL"); MODULE_AUTHOR("ericxiao "); MODULE_DESCRIPTION("slab test module"); static kmem_cache_t *test_cachep = NULL; struct slab_test { int val; }; void fun_ctor(struct slab_test *object , kmem_cache_t *cachep , unsigned long flags ) { ...
在cache这个结构里,有两个很重要的结构:struct array_cache *array[NR_CPUS]与struct kmem_list3 lists;详细分析一下 struct array_cache { unsigned int avail; //当前空闲对象的位置 unsigned int limit; //允许的空闲对象的最大值 unsigned int batchcount; //一次要填充给数组的对象数,或者一次要释放的对象数 unsigned int touched; //如果从该组中分配了对象,则把此值置为1 } ...
七:kmem_cache_free()的实现 kmem_cache_free用于把从slab中分配的对象释放掉,同分配一样,它首先会把它放到AC中,如果AC满了,则把对象释放到share链中,如果share也满了,也就把它释放至slab。来看具体的代码: void kmem_cache_free (kmem_cache_t *cachep, void *objp) { unsigned long flags; local_irq_save(flags); __cache_free(cachep, objp); local_irq_restore(flags); } 函数调用__cache_f...
五:kmem_cache_create()分析 我们以一个例子来跟踪分析一下slab的机制: 下面是一个测试模块的代码: #include #include #include MODULE_LICENSE("GPL"); MODULE_AUTHOR("ericxiao "); MODULE_DESCRIPTION("slab test module"); static kmem_cache_t *test_cachep = NULL; struct slab_test { int val; }; void fun_ctor(struct slab_test *object , kmem_cache_t *cachep , unsigned long flags ) { ...
九:几点补充: 1: slab中使用的页面都会加上“PG_slab”标志,以跟一般的页面区别。另外,在释放内存的时候,经常需要用到从页面到slab的对应转换关系。那是怎样标识的呢? 关于标志: 注意有以下代码: static void *kmem_getpages(kmem_cache_t *cachep, int flags, int nodeid) { …… while (i--) { //为分得的每一个页面设置PG_slab标志 SetPageslab(page); page++; } …… } 关...
七:kmem_cache_free()的实现 kmem_cache_free用于把从slab中分配的对象释放掉,同分配一样,它首先会把它放到AC中,如果AC满了,则把对象释放到share链中,如果share也满了,也就把它释放至slab。来看具体的代码: void kmem_cache_free (kmem_cache_t *cachep, void *objp) { unsigned long flags; local_irq_save(flags); __cache_free(cachep, objp); local_irq_restore(flags); } 函数调用__cache_f...
六:kmem_cache_alloc的实现分析: 我们在上面可以看到,创建一个cache描述符的时候,并没有这之分配slab数据。现在我们来看一下怎么从cache中申请对象 void * kmem_cache_alloc (kmem_cache_t *cachep, int flags) { return __cache_alloc(cachep, flags); } 实际上会调用__cache_alloc 如下: static inline void * __cache_alloc (kmem_cache_t *cachep, int flags) { unsigned long save_flags; void* objp; ...