内存管理API之free_vm_area
2018-01-17 08:23
387 查看
void free_vm_area(struct vm_struct *area)函数释放由area所描述的内核虚拟区间,一般和 alloc_vm_area函数配合使用. 其源码分析如下: void free_vm_area(struct vm_struct *area) { struct vm_struct *ret; #移除area->addr 表示的起始虚拟地址 ret = remove_vm_area(area->addr); BUG_ON(ret != area); #可见保存vm_struct这个结构体的内存是通过kmalloc 申请的,而不能是全局变量 kfree(area); } struct vm_struct *remove_vm_area(const void *addr) { struct vmap_area *va; #看来在释放vm的时候不能睡眠,睡眠的话,这个函数会打印当前的stack might_sleep(); #找到这个地址对应的vmap_area va = find_vmap_area((unsigned long)addr); if (va && va->flags & VM_VM_AREA) { struct vm_struct *vm = va->vm; #将vm结构体的成员变量清零 spin_lock(&vmap_area_lock); va->vm = NULL; va->flags &= ~VM_VM_AREA; va->flags |= VM_LAZY_FREE; spin_unlock(&vmap_area_lock); vmap_debug_free_range(va->va_start, va->va_end); #释放kasan占用的内存 kasan_free_shadow(vm); #umap va表示的area free_unmap_vmap_area(va); return vm; } return NULL; }
相关文章推荐
- 内存管理概述、内存分配与释放、地址映射机制(mm_struct, vm_area_struct)、malloc/free 的实现
- 内存管理API之__get_vm_area
- 内存管理概述、内存分配与释放、地址映射机制(mm_struct, vm_area_struct)、malloc/free 的实现
- 内存管理概述、内存分配与释放、地址映射机制(mm_struct, vm_area_struct)、malloc/free 的实现
- 内存管理API之get_vm_area_size
- 内存管理概述、内存分配与释放、地址映射机制(mm_struct, vm_area_struct)、malloc/free 的实现
- 内存管理API之alloc_vm_area
- 内存管理API之get_unmapped_area
- 内存管理API之mempool_free
- Linux kernel内存管理之free_area
- 内存管理API之free_pages_exact
- 内存管理API之mempool_alloc_pages和mempool_free_pages
- 内存管理API之mempool_alloc_slab和mempool_free_slab
- 内存管理API之__free_pages
- 内存管理API之free_pages
- 内存管理API之__get_free_pages
- 内存管理API之nr_free_buffer_pages
- 内存管理API之kmem_cache_free
- 内存管理2get_vm_area
- 内存储器管理概述、内存分配与释放、地址映射机制(mm_struct, vm_area_struct)、malloc/free 的实现