免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1560 | 回复: 1
打印 上一主题 下一主题

[内存管理] 关于 Slab创建后为何要对静态变量 initarray_cache initarray_generic 等进行替换? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-24 13:49 |只看该作者 |倒序浏览
本帖最后由 honest581 于 2012-06-24 13:50 编辑

    看代码中 调用kmem_cache_init初始化时候,由于slab的kmem_cache没有建立,使用了initarray_cache ,initarray_generic,  initkmem_list3等几个全局变量进行相关数据结构初始化,可是,为什么在初始化完成之前,又使用动态申请的替换回去?请注意,我问的是 为什么要替换成动态的,原来的变量为什么不用了,基于什么考虑,哪位大侠能够简单明了说吗一下,谢谢!
代码如下:
/* 4) Replace the bootstrap head arrays */
        {
                struct array_cache *ptr;

                ptr = kmalloc(sizeof(struct arraycache_init), GFP_KERNEL);

                local_irq_disable();
                BUG_ON(cpu_cache_get(&cache_cache) != &initarray_cache.cache);
                memcpy(ptr, cpu_cache_get(&cache_cache),
                       sizeof(struct arraycache_init));

                /*

                 * Do not assume that spinlocks can be initialized via memcpy:
                 */
                spin_lock_init(&ptr->lock);

                cache_cache.array[smp_processor_id()] = ptr;
                local_irq_enable();

                ptr = kmalloc(sizeof(struct arraycache_init), GFP_KERNEL);

                local_irq_disable();
                BUG_ON(cpu_cache_get(malloc_sizes[INDEX_AC].cs_cachep)
                       != &initarray_generic.cache);
                memcpy(ptr, cpu_cache_get(malloc_sizes[INDEX_AC].cs_cachep),
                       sizeof(struct arraycache_init));
                /*
                 * Do not assume that spinlocks can be initialized via memcpy:
                 */
                spin_lock_init(&ptr->lock);

                malloc_sizes[INDEX_AC].cs_cachep->array[smp_processor_id()] =
                    ptr;
                local_irq_enable();
        }
        /* 5) Replace the bootstrap kmem_list3's */
        {
                int nid;

                /* Replace the static kmem_list3 structures for the boot cpu */
                init_list(&cache_cache, &initkmem_list3[CACHE_CACHE], node);

                for_each_online_node(nid) {
                        init_list(malloc_sizes[INDEX_AC].cs_cachep,
                                  &initkmem_list3[SIZE_AC + nid], nid);

                        if (INDEX_AC != INDEX_L3) {
                                init_list(malloc_sizes[INDEX_L3].cs_cachep,
                                          &initkmem_list3[SIZE_L3 + nid], nid);

                        }
                }
        }

        /* 6) resize the head arrays to their final sizes */
        {
                struct kmem_cache *cachep;
                mutex_lock(&cache_chain_mutex);
                list_for_each_entry(cachep, &cache_chain, next)
                        if (enable_cpucache(cachep))
                                BUG();
                mutex_unlock(&cache_chain_mutex);

论坛徽章:
0
2 [报告]
发表于 2012-06-29 19:27 |只看该作者
我觉得还是尽可能最大化的用slab缓存的概念来管理对象,尽管在初始化的过程中比较繁琐,这样的话就只有cache_cache这个用来存储struct kmem_cache结构对象的缓存是静态创建的,而其他对象都可以动态管理
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP