linux 逆向映射

逆向映射用於創建物理內存頁和使用該頁的進程的對應頁表項之間的聯繫,在換出頁時以便更新全部涉及的進程。獲得物理頁基址後,根據pfn_to_page能夠將頁框轉換爲page實例,page實例中的mapping成員,在映射匿名頁面的時候該成員指向一個anon_vma結構,在映射文件頁面的時候指向inode節點的address-space。這裏簡述一下匿名映射的狀況:html

一個物理頁面能夠同時被多個進程的虛擬地址內存映射,但一個虛擬頁面同時只能有一個物理頁面與之映射。不一樣虛擬頁面同時映射到同一物理頁面是由於子進程克隆父進程VMA,和KSM機制的存在。逆向映射實現的基礎是經過struct anon_vma(簡稱AV)、struct anon_vma_chain(簡稱AVC)和sturct vm_area_struct(簡稱VMA)創建了聯繫,經過物理頁面反向查找到VMA,這三個結構體的關係以下:node

static void anon_vma_chain_link(struct vm_area_struct *vma, struct anon_vma_chain *avc, struct anon_vma *anon_vma)

{
    avc->vma = vma; //創建struct anon_vma_chain和struct vm_area_struct關聯
    avc->anon_vma = anon_vma; //創建struct anon_vma_chain和struct anon_vma關聯
    list_add(&avc->same_vma, &vma->anon_vma_chain);//將AVC添加到struct vm_area_struct->anon_vma_chain鏈表中。
    anon_vma_interval_tree_insert(avc, &anon_vma->rb_root);//將AVC添加到struct anon_vma->rb_root紅黑樹中。
}

 

 

說一下匿名映射狀況下如何經過page獲得對應的pte:匿名映射的狀況下page->mapping指向anon_vma結構,AVC經過紅黑樹結點連接到AV中,而AVC又指向VMA,遍歷anon_vma->rb_root紅黑樹中的AVC,從AVC能夠獲得相應的VMA,所以經過page指向的anon_vma結構能夠獲得與該進程相關的全部vma。前面說到,因爲子進程複製父進程的vma,所以多個不一樣子進程中的虛擬頁面會同時映射到同一個物理頁面,另外多個不相干進程虛擬頁面也能夠經過KSM機制映射到同一個物理頁面。這兩種狀況下經過逆向映射解除對一個頁面的映射的實現是不同的。函數page_referenced會先判斷頁面的類型,若是是KSM頁面走page_referenced_ksm。若是是匿名映射頁,走page_referenced_anon,若是是文件映射頁,走page_referenced_file(對於文件主要就是根據page->mapping->i_mmap獲得相關的vma),page_referenced_ksmpage_referenced_anon的區別在於獲取page對應的虛擬地址上存在差別。app

對於page_referenced_anon,對應到前面說的多個不一樣子進程中的虛擬頁面同時映射到同一個物理頁面的狀況,page->index爲page對應的虛擬頁框在對應vma中的偏移,由於子進程複製父進程的vma,所以他們對應的vma結構都是同樣的,所以page->index在不一樣子進程的vma中的偏移都是一致的,故對於每一個關聯的vma,都經過vma_address(page, vma)即可以獲取page在當前vma對應的虛擬地址,且經過vma能夠獲得mm,進一步獲得pgd。經過pgd和虛擬地址,能夠繼續遍歷頁表獲得pte,而後解除映射。函數

對於page_referenced_ksm,因爲是不一樣進程的虛擬頁面映射到同一個物理頁面,所以page對應的虛擬頁框在不一樣進程的vma中的偏移確定是不一致的,這裏就不能對每一個vma都經過vma_address(page, vma)獲得page對應的虛擬地址。內核中對於ksm頁面,內核維護了一個結構體rmap_item,經過stable_node->hlist將使用了ksm頁面的rmap_item鏈接起來。rmap_item中維護了page對應的虛擬地址addressanon_vma結構,基於此獲得對應的vma,虛擬地址經過rmap_item獲得,而後進一步解除映射。post

共享內存方式的頁如何經過逆向映射解除映射:應該是經過文件的方式,內核實現的shm共享內存會分配一個文件標識符,而mmap實現的共享內存要麼是在父子進程之間,要麼就是文件映射。url

 

參考:http://www.javashuo.com/article/p-onjmudzu-m.html
spa

http://www.javashuo.com/article/p-pltsmpde-p.htmlcode

相關文章
相關標籤/搜索