修復在虛擬記憶體管理中的 VMA 操作中意味著什麼
我正在閱讀Gorman的“了解 Linux 虛擬記憶體管理器”。
在第 4 章關於程序地址空間的介紹中,當介紹 VMA 操作(例如創建、鎖定和解鎖)時,文中提到了“修復區域”。“修復”具體是什麼意思?它是否以相同的方式適用於不同的 VMA 操作?
詳細報價:
Linux 可以通過系統呼叫 mlock() 將地址範圍內的頁面鎖定到記憶體中,該系統呼叫由 sys_mlock() 實現,其呼叫圖如圖 4.10 所示。在高層次上,功能很簡單;它為要鎖定的地址範圍創建一個 VMA,在其上設置 VM_LOCKED 標誌,並使用 make_pages_present() 強制所有頁面出現。還提供了映射到 sys_mlockall() 的第二個系統呼叫 mlockall(),它是一個簡單的擴展,可以執行與 sys_mlock() 相同的工作,但呼叫程序中的每個 VMA 除外。這兩個函式都依賴於核心函式 do_mlock() 來執行查找受影響的 VMA 並決定需要什麼函式來修復區域的實際工作,如下所述。
系統呼叫 munlock() 和 munlockall() 為鎖定函式提供了推論,並分別映射到 sys_munlock() 和 sys_munlockall()。這些函式比鎖定函式簡單得多,因為它們不必進行大量檢查。它們都依賴於相同的 do_mmap() 函式來修復區域。
如果要進行映射的地方存在舊區域,請將其修復以適合新映射;
書中使用的核心版本是Linux 2.4.22。
在這種情況下,“修復”意味著適當地合併或拆分 VMA,以便它們與被操作的區域匹配:
- 如果要鎖定(或解鎖)的區域小於包含它的 VMA,則需要拆分 VMA;
- 如果可以合併連續的 VMA,它們應該可以。
您正在閱讀的文件很舊,但這仍然適用於目前核心。修復由
mlock_fixup
, 呼叫vma_merge
和split_vma
酌情處理。另請參閱描述不可撤銷的 LRU 基礎結構的文件。