2011-04-13 62 views
3

書中http://www.ecsl.cs.sunysb.edu/elibrary/linux/mm/mm.pdf 第202頁的〜203一個關於內存管理(Linux)的功能arch_get_unmapped_area

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; 
} 

如果地址不爲零的問題,我們將其調整到一個頁面邊界。我們調用函數 查找vma()以查看給定地址是否包含在現有VMA中。如果 它不包含在任何VMA中,並且映射的結尾位於 進程地址空間內,我們將返回地址。

我的問題是:
爲什麼我們檢查到addr + len個< =的vma-> vm_start?
怎麼可能addr + len < = vma-> vm_start?如果在vma中找到addr,那麼addr> vm_start,對吧?如果len是正數(應該是正確的),那麼addr + len < = vma-> vm_start?

回答

1

答案,如果你在find_vma的來源看此言明確:

/*查找滿足地址< vm_end第一VMA,如果沒有則爲null。 */

因此,find_vma()可能會返回一個並不真正映射地址的vma,因此會進行檢查。