我們知道linux的記憶體管理系統中有」反向對映「這一說,目的是為了快速去查詢出乙個特定的物理頁在哪些程序中被對映到了什麼位址,這樣如果我們想把這一頁換出(swap),或是遷移(migrate)的時候,就能相應該更改所有相關程序的頁表來達到這個目的。
物理記憶體的分頁機制,乙個pte(page table entry)對應乙個物理頁,但乙個物理頁可以由多個pte與之相對應,當該頁要被**時,linux2.4的做法是遍歷每個程序的所有pte判斷該pte是否與該頁建立了對映,如果建立則取消該對映,最後無pte與該相關聯後才**該頁。該方法顯而易見效率極低,因為其為了查詢某個頁的關聯pte遍歷了所有的pte,我們不禁想:如果把每個頁關聯的pte儲存在頁結構裡面,每次只需要訪問那些與之相關聯的pte不很方便嗎?確實,2.4之後確實採用過此方法,為每個頁結構(page)維護乙個鍊錶,這樣確實節省了時間,但此鍊錶所占用的空間及維護此鍊錶的代價很大,在2.6中棄之不用,但反向對映機制的思想不過如此,所以還是有參考價值的,可以參考:
page, address_space, vm_area_struct, mm_struct, anon_vma.
以下均顯示部分成員:
每個程序有個程序描述符task_struct,其中有mm域指向該程序的記憶體描述符mm_struct。
每個程序都擁有乙個記憶體描述符,其中有pgd域,指向該程序位址空間的全域性頁目錄;mmap域指向第乙個記憶體區域描述符vm_area_strut1。
程序通過記憶體區域描述符vm_area_struct管理記憶體區域,每個記憶體區域描述符都有vm_start和vm_end域指向該記憶體區域的在虛擬記憶體中的起始位置;vm_mm域指向該程序的記憶體描述符;每個vm_area_struct都有乙個anon_vma域指向該程序的anon_vma;
每個程序都有乙個anon_vma,是用於鏈結所有vm_area_struct的頭結點,通過vm_area_struct的anon_vma_node構成雙迴圈鍊錶。
最終形成了上圖。
還沒開始看檔案系統一節,所以try_to_unmap_file沒看懂,所以此處只分析 try_to_unmap_anon函式,等看完vfs後再來補充吧。
linux採用**頁表: pgd:頂級頁表,由pgd_t項組成的陣列,其中第一項指向乙個二級頁表。
pmd:二級頁表,由pmd_t項組成的陣列,其中第一項指向乙個**頁表(兩級處理器沒有物理的pmd)。
linux多執行緒 9 匿名記憶體對映
1 使用 dev zero檔案。2 形式上沒有檔案。先看第一種,由於 dev zero本來已經存在,因此open的時候不需要第三個引數,第二個引數指定為o rdwr即可。include include include include include include include struct fi...
linux的臨時頁表對映問題
linux核心初始化的時候要啟動分頁,既然要啟動分頁就要有相應的頁表,有頁表就要有頁目錄,很多人都知道系統啟動的時候要把實體地址的0 8m對映到虛擬位址的0 8m還要再對映到768m 768m 8m,這到底是為什麼呢?頁目錄的乙個目錄項對映4m的記憶體,為了對映8m的記憶體就要兩個目錄項,具體就是第...
檔案頁和匿名頁
記憶體 也就是系統釋放掉可以 的記憶體,比如快取和緩衝區,就屬於可 記憶體。它們在記憶體管理中,通常被叫做檔案頁 file backed page 大部分檔案頁,都可以直接 以後有需要時,再從磁碟重新讀取就可以了。那些被應用程式修改過,並且暫時還沒寫入磁碟的資料 也就是髒頁 就得先寫入磁碟,然後才能...