第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非零,我们将其与页面边界对齐。我们称之为功能 找到vma()以查看给定地址是否包含在现有VMA中。如果 它不包含在任何VMA中,并且映射的结尾位于 进程地址空间,我们返回地址。
我的问题是:
为什么我们检查addr + len&lt; = vma-&gt; vm_start?
怎么可能addr + len&lt; = vma-&gt; vm_start?如果在vma中找到addr,则addr&gt; vm_start,对吗?如果len是正数(应该是正确的),那么addr + len&lt; = vma-&gt; vm_start怎么办?
答案 0 :(得分:1)
如果您查看find_vma源代码中的注释,答案就会清楚:
/ *查找满足addr的第一个VMA&lt; vm_end,如果没有则为NULL。 * /
因此,find_vma()可能会返回一个实际上没有映射地址的vma,因此会进行检查。