内存管理(Linux)中的函数arch_get_unmapped_area的问题

3
在书籍http://www.ecsl.cs.sunysb.edu/elibrary/linux/mm/mm.pdf的第202~203页中:
if (addr) {
   addr = PAGE_ALIGN(addr);
   vma = find_vma(current->mm, addr);
   if (TASK_SIZE - len >= addr &&
   (!vma || addr + len <= vma->vm_start))
   return addr;
}

如果addr非零,则对其进行页面对齐。 我们调用函数find vma()来查看给定地址是否包含在现有的VMA中。 如果它不包含在任何VMA中且映射的结尾在进程地址空间内,则返回该地址。 我的问题是: 为什么我们要检查addr + len <= vma->vm_start? 如果在vma中找到了一个addr,那么addr > vm_start,对吧?如果len是正数(应该是吧),那么addr + len怎么可能小于等于vma->vm_start呢?
1个回答

1
如果您查看find_vma源代码中的注释,答案就会变得清晰明了:
/* 查找第一个满足 addr < vm_end 的VMA,如果没有则返回NULL。*/
因此,find_vma()可能会返回一个实际上并未映射地址的vma,因此需要进行检查。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接