Linux内核深度解析
上QQ阅读APP看书,第一时间看更新

3.4.5 删除内存映射

系统调用munmap用来删除内存映射,它有两个参数:起始地址和长度。

系统调用munmap的执行流程如图3.15所示,它把主要工作委托给源文件“mm/mmap.c”中的函数do_munmap。

图3.15 系统调用munmap的执行流程

(1)根据起始地址找到要删除的第一个虚拟内存区域vma。

(2)如果只删除虚拟内存区域vma的一部分,那么分裂虚拟内存区域vma。

(3)根据结束地址找到要删除的最后一个虚拟内存区域last。

(4)如果只删除虚拟内存区域last的一部分,那么分裂虚拟内存区域last。

(5)针对所有删除目标,如果虚拟内存区域被锁定在内存中(不允许换出到交换区),那么调用函数munlock_vma_pages_all以解除锁定。

(6)调用函数detach_vmas_to_be_unmapped,把所有删除目标从进程的虚拟内存区域链表和树中删除,单独组成一条临时的链表。

(7)调用函数unmap_region,针对所有删除目标,在进程的页表中删除映射,并且从处理器的页表缓存中删除映射。

(8)调用函数arch_unmap执行处理器架构特定的处理。各种处理器架构自定义函数arch_unmap,它默认是一个空函数。

(9)调用函数remove_vma_list删除所有目标。