本文共 979 字,大约阅读时间需要 3 分钟。
vmallocvmalloc_init for_each_possible_cpu(i) { // vfree_deferred 类型变量的 链表 和 工作任务 free_work // free_work用于vfree执行时延迟异步释放vmalloc内存 struct vfree_deferred *p; ... // vmap_block_queue 类型变量的链表和锁 // vmap_block_queue 是 非连续内存块队列管理结构 struct vmap_block_queue *vbq; ... } // 将vmalloc_init之前的过程中分配的vmalloc区域插入红黑树vmap_area_root中 // 将挂接在vmlist链表的各项__insert_vmap_area()输入到非连续内存块的管理中 // vmlist的初始化是通过iotable_init初始化(arm32) // 最终所有的vmalloc的eara都会挂到vmap_area_list链表中 for (tmp = vmlist; tmp; tmp = tmp->next) { struct vmap_area *va = kmem_cache_zalloc(vmap_area_cachep, GFP_NOWAIT); va->vm = tmp; ... insert_vmap_area(va, &vmap_area_root, &vmap_area_list); } vmap_init_free_space(); vmap_initialized = true;
vmap_area 结构体 中 有两个成员 1. list , 用来挂 在 vmap_area_list 2. rb_node , 用来挂 在 vmap_area_root其他成员va_start vmalloc区的虚拟区间起始地址va_end vmalloc区的虚拟区间结束地址flags 类型标识rb_node 插入红黑树vmap_area_root的节点list 用于加入链表vmap_area_list的节点purge_list 用于加入到全局链表vmap_purge_list中vm 指向对应的vm_struct
转载地址:http://zjigi.baihongyu.com/