在书籍http://www.ecsl.cs.sunysb.edu/elibrary/linux/mm/mm.pdf的第202~203页中:
如果addr非零,则对其进行页面对齐。 我们调用函数find vma()来查看给定地址是否包含在现有的VMA中。 如果它不包含在任何VMA中且映射的结尾在进程地址空间内,则返回该地址。 我的问题是: 为什么我们要检查addr + len <= vma->vm_start? 如果在vma中找到了一个addr,那么addr > vm_start,对吧?如果len是正数(应该是吧),那么addr + len怎么可能小于等于vma->vm_start呢?
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呢?