又仔细走读了一下代码,是在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(下全局链)
流程如下
进程终止 -> 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(下全局链)