- 论坛徽章:
- 0
|
回复 2# Buddy_Zhang1
你好。
如果说可以重叠话,那也挺困惑的。
假设addr = prev->end.
end 是在next的区间内部的(next-> start < end < next->end).
那么程序的执行就是:
struct vm_area_struct *vma_merge(............)
{
pgoff_t pglen = (end - addr) >> PAGE_SHIFT;
struct vm_area_struct *area, *next;
if (vm_flags & VM_SPECIAL)
return NULL;
if (prev)
next = prev->vm_next;
else
next = mm->mmap;
area = next;
if (next && next->vm_end == end) /* cases 6, 7, 8 */
next = next->vm_next;
if (prev && prev->vm_end == addr && mpol_equal(vma_policy(prev), policy) && can_vma_merge_after(prev, vm_flags, anon_vma, file, pgoff)) {
if (next && end == next->vm_start &&mpol_equal(policy, vma_policy(next)) &&can_vma_merge_before(next, vm_flags, anon_vma, file, pgoff+pglen) && is_mergeable_anon_vma(prev->anon_vma, next->anon_vma)) {
/* cases 1, 6 */
vma_adjust(prev, prev->vm_start, next->vm_end, prev->vm_pgoff, NULL);
} else /* cases 2, 5, 7 */
vma_adjust(prev, prev->vm_start, end, prev->vm_pgoff, NULL);
return prev;
}
....
....
return NULL;
}
程序中对A和要新添加的区域进行了调用can_vma_merge_after来判断属性是不是可以合并,假设可以合并。
在vma_adjust会对B区域进行分割。但是,并没有对新添加的区域和B进行判断属性。
可以允许这样的操作?
|
|