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 的变化
https://www.cnblogs.com/zhangzhiwei122/p/16102991.html