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;
}
内存管理API之free_vm_area
最新推荐文章于 2024-07-30 17:41:09 发布