arm64内存-vmalloc_init

上一篇: slub 分配器 - kmem_cache_init  kmalloc / kfree

https://www.cnblogs.com/zhangzhiwei122/p/16102021.html

 

start_kernel -> mm_init -> vmalloc_init

 818/*
 819 * Set up kernel memory allocators
 820 */
 821static void __init mm_init(void)
 822{

 835        vmalloc_init();

 

vmalloc_init

在  mm/vmalloc.c

 

关于 vmalloc ,这篇文章很好的说明了 它的作用和机制

参考: https://www.cnblogs.com/LoyenWang/p/11965787.html

 

阅读完上面文章后,对于vmalloc_init 初始化过程就容易理解了

1968void __init vmalloc_init(void)
1969{
1970        struct vmap_area *va;
1971        struct vm_struct *tmp;
1972        int i;
1973
1974        /*
1975         * Create the cache for vmap_area objects.
1976         */
1977        vmap_area_cachep = KMEM_CACHE(vmap_area, SLAB_PANIC);
1978
1979        for_each_possible_cpu(i) {
1980                struct vmap_block_queue *vbq;
1981                struct vfree_deferred *p;
1982
1983                vbq = &per_cpu(vmap_block_queue, i);
1984                spin_lock_init(&vbq->lock);
1985                INIT_LIST_HEAD(&vbq->free);
1986                p = &per_cpu(vfree_deferred, i);
1987                init_llist_head(&p->list);
1988                INIT_WORK(&p->wq, free_work);
1989        }
1990
1991        /* Import existing vmlist entries. */
1992        for (tmp = vmlist; tmp; tmp = tmp->next) {
1993                va = kmem_cache_zalloc(vmap_area_cachep, GFP_NOWAIT);
1994                if (WARN_ON_ONCE(!va))
1995                        continue;
1996
1997                va->va_start = (unsigned long)tmp->addr;
1998                va->va_end = va->va_start + tmp->size;
1999                va->vm = tmp;
2000                insert_vmap_area(va, &vmap_area_root, &vmap_area_list);

2001        }
2002
2003        /*
2004         * Now we can initialize a free vmap space.
2005         */
2006        vmap_init_free_space();
2007        vmap_initialized = true;
2008}

1994 ~ 1997 使用前面刚初始化过的  slub  kmem_cache_create 函数,创建   kmem_cache 对象,名称为 vmap_area ,   用来 分配  vmap_area  对象 。 

1979 ~ 1989 初始化 per cpu 对象   vmap_block_queue ;  初始化 per cpu 对象   vfree_deferred 【  vfree  导致  映射关系 改变,需要刷新 TLB 等,延迟执行 TLB 刷新等动作 需要记录信息,记录在这个  vfree_deferred 里面】

1992 从全局 变量 vmlist 中取出  vm_struct 对象,为其 构建     vmap_area 对象,并将 vmap_area 对象插入  vmap_area_root 红黑树 和 vmap_area_list 链表 中 。 

2006 vmap_init_free_space  在本文件中的 static 函数,向  free_vmap_area_root 和 free_vmap_area_list 里面插入 vmap_area 对象 。 描述空闲的地址空间

 

5.4 版本之后, vmap_area_root  和 vmap_area_list 描述已经分配出去的 地址区间; free_vmap_area_root 和 free_vmap_area_list 描述 空闲的地址区间。

见: https://blog.csdn.net/m0_37797953/article/details/118481746   描述 5.4 版本中 vmalloc 的变化

 

下一篇: arm64内存-【转载】用户态进程的地址空间管理

https://www.cnblogs.com/zhangzhiwei122/p/16102991.html

 

posted @ 2022-04-05 16:38  张志伟122  阅读(154)  评论(0编辑  收藏  举报