看了一下關於RMAP的東西,感覺看的雲裏霧裏,現在簡單總結下RMAP的作用:
產生背景:
我們知道一個page可以被多個進程的多個虛擬地址映射到,但是如果需要從page找到所有映射這個page的虛擬地址需要同時訪問系統當前所有進程的進程空間的VMA,從中去尋找是否有虛擬地址映射到了此頁面,對於系統來說,這是一個非常繁重的工作,所以這裏需要一種可以從page快速找到所有映射了此頁面的VMA,這種情況下RMAP就誕生了。
產生page映射的幾種情況:
1.進程缺頁中斷分配的物理內存並建立映射。
2. 父進程創建子進程,copy父進程的VMAs到子進程,這時候會出現多個子進程的虛擬頁面會映射到同一個物理頁面。
3. 子進程產生寫時複製操作,新建一個page並建立映射。
RMAP的作用就是在以上三種情況下,通過新的數據結構anon_vma以及anon_vma_chain建立子進程與父進程之間的內存映射的聯繫,從而在需要尋找某個物理頁面的映射關係的時候只需要遍歷通過以上兩個數據結構建立起來的聯繫的框架裏面的VMA就可以找到對應的映射到物理頁面的VMA。
下面是截自奔跑吧裏面的一幅RMAP映射的關係圖: