????????
????????Linux通過MMU進行虛擬地址到物理地址的轉換,當進程執行fork()后,會把頁中的權限設置為RD-ONLY(只讀)。
MMU(內存管理單元)
·???????MMU本質是一個集成在CPU核心的硬件電路模塊,其核心任務是實現和管理虛擬內存機制,主要是進行虛擬地址到物理地址的實時、高效轉換。
在Linu系統中,MMU的作用是:
- 提供虛擬地址空間抽象:采用虛擬的思想,讓每個進程都感覺自己擁有一個連續的,獨立的,巨大的內存空間(這個空間從0開始)
- 內存保護和隔離:防止一個進程無意或惡意地訪問或修改另一個進程的內存
- 內存利用:只加載程序實際需要的部分到物理內存
- 共享內存:允許多個進程安全地共享相同的物理內存頁
工作流程:
- 頁表管理:Linux內核負責創建,修改和銷毀進程的頁表結構。在進程創建、內存分配、缺頁處理、進程切換時執行這些操作
- CPU發出虛擬地址
- MMU基于頁表將虛擬地址轉換物理地址
- 訪問頁表
- 缺頁處理:當MMU在地址轉換過程中無法找到有效的PTE或遇到權限錯誤時,它會觸發一個Page Fault中斷給一個CPU。CPU陷入內核模式
- 虛擬地址解析:MMU將地址分為兩部分:
- 高階位:用作進入頁表的索引
- 低階位:頁內偏移量
COPY-ON-WRITE
-
最開始,當一個新進程通過fork被創建,或者創建共享內存映射(mmap)時,父子進程(或映射共享區域)最初共享相同的物理內存頁。內核將進程/映射的頁表項標記為只讀或設置COW標志。此時沒有發生實際的物理內存復制。
- 復制頁表:Linux內核會為字進程創建一份父進程頁表的副本。此時,父子進程都指向相同的物理頁框。
- 修改權限:內核不僅會將父子進程頁表中指向共享物理頁的頁表項權限設置為 RD-ONLY,還會設置一個專門的標記位來標志這是一個COW頁(并非所有RD-ONLY頁都是COW頁),這個標記能告訴內核缺頁處理程序——如果該頁發生了寫保護錯誤,別直接報錯,可能是一個COW頁
-
進程嘗試寫入
- ??CPU 嘗試執行寫指令:?? P1 執行一條向該共享虛擬地址(比如 Virtual Address 1, VA1)寫入數據的指令。
?? * MMU 觸發 Page Fault:??
?? * 原因1:寫操作檢測:?? MMU 發現當前指令要求寫入一個權限為 RO 的內存頁。
?? * 原因2:權限沖突:?? RO 權限不允許寫入,違反了頁表項中的權限設置。 - ??中斷:?? MMU 產生一個 ??Page Fault 異常 (中斷)??。CPU 停止當前用戶態代碼的執行,切換到內核態,調用 Linux 內核的缺頁中斷處理程序 (Page Fault Handler)。
- 執行COW
- 分配新物理頁面:內核從空閑物理頁面中分配新的物理頁面
- 復制內容:內核將原始物理頁框的內容完整復制到這個新分配的物理頁框
- 更新頁表:內核修改進程的頁表,及那個該頁表項指向新的物理頁框地址,并設置權限為可讀寫或其他,然后清除COW標志
- 恢復執行
(如果有)內核完后缺頁處理,CPU恢復用戶態進程的執行,重新執行那條發生缺頁的指令
- ??CPU 嘗試執行寫指令:?? P1 執行一條向該共享虛擬地址(比如 Virtual Address 1, VA1)寫入數據的指令。