- 论坛徽章:
- 16
|
本帖最后由 embeddedlwp 于 2011-09-04 17:16 编辑
linux 2.6.11的内存管理部分,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;
- }
复制代码 在ULK3 P371上的解释是find_vma_prepare()函数也检查是否还存在与新区间重叠的线性区。这种情况发生在函数返回一个非空的地址,这个地址指向一个线性区,而该区的起始地址位置位于新区间结束地址之前的时候。在这种情况下,do_mmap_pgoff()调用do_munmap()删除新的区间,然后重复整个步骤。
这里如果重复整个步骤,也就是重新执行find_vma_prepare,之前调用do_munmap释放了那个由get_unmmaped_area找到的空闲的地址空间,那个find_vma_prepare也没有分配地址空间的功能,那么程序怎么往下执行了啊?我感觉get_unmmaped_area找到的空闲地址空间一定是不与别的区间重叠的(否则返回NULL),这样这段code就不会执行了。 |
|