**mmap.c文件代码分析do_munmap**
/*撤销映射*/
/*与du_mmap相反,撤销映射关系销vma段的函数*/
int do_munmap(struct mm_struct *mm, unsigned long addr, size_t len)
{
struct vm_area_struct *mpnt, *prev, **npp, *free, *extra;
/*如果给出的线性地址没页对其,
或者其起始和终止地址大于3GB,则出错返回*/
if ((addr & ~PAGE_MASK) || addr > TASK_SIZE || len > TASK_SIZE-addr)
return -EINVAL;
/*如果取消映射区间的长度小于一个页面,出错返回*/
if ((len = PAGE_ALIGN(len)) == 0)
return -EINVAL;
/* Check if this memory area is ok - put it on the temporary
* list if so.. The checks here are pretty simple --
* every area affected in some way (by any overlap) is put
* on the list. If nothing is put on, nothing is affected.
*/
/*
#找到起始地址是落在哪个vm_area_struct *vma内
函数find_vma_prev()与find_vma相似
它返回在vma链表中满足addr<vm_emd关系的第个vma块,
如果失败返null。
不同的只是同时返回了这个vma块在链表中的前一个vma块的指针,
存放在参数prev所指的区域中。
*/
mpnt = find_vma_prev(mm, addr, &prev);
/*没有找到这个vma的话,直接返回*/
/*find_vma_prev()的返回值null表明所给的地址addr在所有的vma块的地址范围之后