記憶體管理深度解析:從靜態分區到虛擬記憶體演進
記憶體管理是作業系統最核心、最複雜的子系統之一,解決「多程式如何共存、如何隔離、如何突破物理容量限制」三大根本問題。本文系統梳理管理功能、四種分配演進、位址轉換機制、保護策略與虛擬記憶體核心技術。
一、記憶體管理四大核心功能
| 功能 | 核心任務 | 關鍵技術 |
| 記憶體分配 | 依策略分配主存空間 | 分區、分頁、分段、伙伴系統、SLAB |
| 位址轉換 | 邏輯位址 → 物理位址 | MMU、頁表、TLB、段表、基址/界限暫存器 |
| 記憶體保護 | 隔離程序、防止越界存取 | 特權模式、頁表權限位、鑰匙/域、ASLR、DEP/NX |
| 記憶體擴充 | 小記憶體跑大程式 | 覆蓋、交換、虛擬記憶體、記憶體壓縮 |
二、記憶體分配策略演進史
- 單一連續分配:早期單用戶系統,無保護、無多工。
- 固定分區:啟動時劃分固定大小分區,內部碎片嚴重、多工度固定。
- 動態分區:依程式大小動態切割,首次適配/最佳/最差適配,外部碎片需緊湊技術整理。
- 分頁式:邏輯/物理同分固定大小頁框,消除外部碎片,引入頁表、TLB、多級頁表。
- 分段式:按邏輯單元(代碼、資料、堆疊)分段,支援共享/保護,但產生外部碎片。
- 段頁式:段內分頁,結合邏輯模組化與物理管理優勢(Intel x86 保護模式、Multics、OS/2)。
三、位址轉換機制演進
三級位址空間映射
原始碼符號 → 編譯器 → 邏輯位址 → 載入器/連結器 → 線性位址 → MMU/頁表 → 物理位址
分頁式位址轉換流程
- CPU 產生邏輯位址:
頁號 | 頁內位移
- 查 TLB(快取頁表項),命中 → 直接得物理頁框號。
- 未命中 → 走頁表走查(多級頁表:PGD → PUD → PMD → PTE)。
- 組合物理位址:
物理頁框號 | 頁內位移。
- 若頁表項「不在場位」=1 → 觸發缺頁中斷 → 頁面置換演算法調入頁框。
四、記憶體保護機制
- 分界法:基址/界限暫存器,硬體比較越界即例外(早期簡單系統)。
- 分頁保護位:R/W/X、User/Supervisor、Dirty、Accessed、NX/DEP(防緩衝區溢位攻擊)。
- 環狀保護:Ring 0 核心態、Ring 3 使用者態,特權指令/IO/暫存器僅 Ring 0 可用。
- ASLR:隨機化堆疊、堆、共享庫、執行檔基址,緩解 ROP 攻擊。
- 核心頁表隔離:KPTI 緩解 Meltdown 類側通道攻擊。
五、虛擬記憶體:突破物理限制的關鍵技術
兩大基石
- 局部性原理:時間局部性(迴圈、遞歸)、空間局部性(陣列、類別成員)。
- 需求分頁:只載入當前需要的頁,其餘留在磁碟。
頁面置換演算法
| 演算法 | 原理 | 優/缺點 | 實作難度 |
| FIFO | 最早調入的先淘汰 | 簡單但有 Belady 異常 | 低 |
| LRU | 最久未使用的先淘汰 | 接近最優,需硬體支援或近似 | 中 |
| Clock/Second Chance | 循環掃描參考位 | LRU 近似、低開銷 | 低 |
| LFU | 使用頻率最低先淘汰 | 適應工作負載變化慢 | 高 |
| 工作集/WSClock | 依時間窗口保留活躍頁面 | 理論最強、實作複雜 | 高 |
關鍵優化技術
- 頁面預讀/預取:循序存取模式預先載入鄰近頁。
- 複製時寫:fork() 共享物理頁,寫入時才複製。
- 記憶體壓縮:zswap/zram 將冷頁壓縮留在記憶體,減少交換 I/O。
- 巨型頁:2 MB/1 GB 大頁減少頁表層級、提升 TLB 覆蓋率(資料庫、HPC 關鍵)。
六、現代 OS 實作重點
- Linux:
mm_struct、vm_area_struct、反向映射、KSM 記憶體合併、CMA 連續記憶體分配器。
- Windows:VAD 樹、工作集管理、超級預讀、記憶體壓縮存儲、核心頁表隔離。
- 嵌入式/RTOS:靜態分配、記憶體池、MPU 保護單元、無 MMU 情況下的 uClinux 方案。