关于内存管理中的函数arch_get_unmapped_area的问题(linux)

时间:2011-04-13 02:37:52

标签: c linux memory operating-system linux-kernel

<{3}}一书中的

第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怎么办?

1 个答案:

答案 0 :(得分:1)

如果您查看find_vma源代码中的注释,答案就会清楚:

/ *查找满足addr的第一个VMA&lt; vm_end,如果没有则为NULL。 * /

因此,find_vma()可能会返回一个实际上没有映射地址的vma,因此会进行检查。