目录
本专栏文章将有70篇左右,欢迎+关注,查看后续文章。
4.5 VMA相关操作
查找:
从mm_struct中查找包含指定地址的VMA。
合并:
合并两个相邻VMA。
插入:
将VMA插入到mm_struct中。
删除:
从mm_struct中删除VMA。
4.5.1 查找VMA
即从mm_struct中查找包含addr地址的VMA。
struct vm_area_struct *find_vma(struct mm_struct *mm, unsigned long addr)
{
struct vm_area_struct *vma = mm->mmap_cache; //缓存的VMA
if (vma && vma->vm_end > addr && vma->vm_start <= addr){
//如果缓存的VMA包含该addr,即找到了。
return vma;
}
//否则遍历红黑树查找。(红黑树包含了该进程空间所有的VMA)
struct rb_node *rb_node = mm->mm_rb.rb_node; //红黑树的根节点
vma = NULL;
while (rb_node) {
struct vm_area_struct *vma_tmp;
vma_tmp = rb_entry(rb_node, struct vm_area_struct, vm_rb);
if (vma_tmp->vm_end > addr) {
vma = vma_tmp;
if (vma_tmp->vm_start <= addr )
break;
rb_node = rb_node->rb_left;
} else
rb_node = rb_node->rb_right;
}
if (vma)
mm->mmap_cache = vma; //找到VMA后,缓存起来。
} //