- 論壇徽章:
- 16
|
本帖最后由 embeddedlwp 于 2011-09-04 17:16 編輯
linux 2.6.11的內(nèi)存管理部分,do_mmap_pgoff中有這么一段- munmap_back:
- vma = find_vma_prepare(mm, addr, &prev, &rb_link, &rb_parent);
- if (vma && vma->vm_start < addr + len) {
- if (do_munmap(mm, addr, len))
- return -ENOMEM;
- goto munmap_back;
- }
復(fù)制代碼 在ULK3 P371上的解釋是find_vma_prepare()函數(shù)也檢查是否還存在與新區(qū)間重疊的線性區(qū)。這種情況發(fā)生在函數(shù)返回一個非空的地址,這個地址指向一個線性區(qū),而該區(qū)的起始地址位置位于新區(qū)間結(jié)束地址之前的時候。在這種情況下,do_mmap_pgoff()調(diào)用do_munmap()刪除新的區(qū)間,然后重復(fù)整個步驟。
這里如果重復(fù)整個步驟,也就是重新執(zhí)行find_vma_prepare,之前調(diào)用do_munmap釋放了那個由get_unmmaped_area找到的空閑的地址空間,那個find_vma_prepare也沒有分配地址空間的功能,那么程序怎么往下執(zhí)行了?我感覺get_unmmaped_area找到的空閑地址空間一定是不與別的區(qū)間重疊的(否則返回NULL),這樣這段code就不會執(zhí)行了。 |
|