您的位置:首页 > 运维架构 > Linux

进程所用内存(包括页表、vma、映射内存)的释放过程 (基于linux2.6.11.12)

2016-04-15 11:21 441 查看
又仔细走读了一下代码,是在exit_mmap中释放的页表所用的内存,被ULK带沟里去了,以为在mmdrop里面是否

流程如下

进程终止 -> do_exit -> exit_mm -> mmput 

1. 释放进程映射的内存和vma所用内存

mmput -> exit_mmap ->  unmap_vmas(&tlb, mm, mm->mmap, 0,~0UL, &nr_accounted, NULL); 

mmput -> exit_mmap ->  remove_vm_struct

2. 释放进程页表所用内存

(32bit只是释放PTE那个级别,因为其他级别页表(PGD,PUD,PMD)没有用用满,不满足start|end的对其条件;

 PT级别都是整页分配,所以满足对其条件进行释放;

 64bit这里会释放除了PGD以外所有页面)

mmput -> exit_mmap ->  clear_page_range -> clear_pgd_range(释放PGD) -> clear_pud_range()(释放PUD)-> clear_pmd_range (释放pmd)-> pte_free_tlb(释放PTE)

pte_free_tlb -> __pte_free_tlb -> tlb_remove_page -> free_page_and_swap_cache(单核释放page) or tlb_flush_mmu(多核是否page(未达到限定值))

3. 32bit释放PGD、PUD、PMD所用页面

finish_task_switch -> mmdrop -> __mmdrop -> mm_free_pgd -> pgd_free 

a. 64bit pgd_free 释放1个PGD页面

b. 32bit PAE 释放3个PMD页面和1个PGD

pgd_free -> kmem_cache_free (释放3个PMD,PGD) -> pmd_dtor 和 pgd_dtor

c. 32bit 释放1个PGD页面

pgd_free -> kmem_cache_free (PGD) -> pgd_dtor(下全局链)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: