static inline struct vm_area_struct * find_vma_intersection(struct mm_struct * mm, unsigned long start_addr, unsigned long end_addr)
这个函数用于查找在start_addr~end_addr ,之间的第一个vma
其使用的例程如下:
int get_vaddr_frames(unsigned long start, unsigned int nr_frames,
unsigned int gup_flags, struct frame_vector *vec)
{
struct mm_struct *mm = current->mm;
struct vm_area_struct *vma;
int ret = 0;
int err;
int locked;
if (nr_frames == 0)
return 0;
if (WARN_ON_ONCE(nr_frames > vec->nr_allocated))
nr_frames = vec->nr_allocated;
down_read(&mm->mmap_sem);
locked = 1;
vma = find_vma_intersection(mm, start, start + 1);
if (!vma) {
ret = -EFAULT;
goto out;
}
}
其源码分析如下:
static inline struct vm_area_struct * find_vma_intersection(struct mm_struct * mm, unsigned long start_addr, unsigned long end_addr)
{
#调用find_vma找到包含start_addr 的vma
struct vm_area_struct * vma = find_vma(mm,start_addr);
#如果找到vma,但是vma 不在start_addr和end_addr 之前的话,就等于没有找到
#start_addr~end_addr之间的vma。就返回null
if (vma && end_addr <= vma->vm_start)
vma = NULL;
#找到start_addr~end_addr之间的第一个vma
return vma;
}
内存管理API之find_vma_intersection
最新推荐文章于 2022-08-29 23:30:02 发布