一、分頁管理原理
-
基本概念:
-
物理內存被劃分為固定大小的頁框(Page Frame),邏輯地址空間被劃分為相同大小的頁(Page)。
-
通過頁表(Page Table)實現邏輯地址到物理地址的映射。
-
邏輯地址 = 頁號(Page Number) + 頁內偏移(Offset)。
-
頁表存儲頁號到物理頁框號的映射關系。
-
-
地址轉換流程:
-
CPU生成邏輯地址。
-
提取頁號和頁內偏移。
-
查詢頁表獲取物理頁框號。
-
物理地址 = 物理頁框號 × 頁大小 + 頁內偏移。
-
-
關鍵問題:
-
頁表存儲開銷大(多級頁表解決)。
-
地址轉換速度(TLB緩存加速)。
-
二、分頁管理模擬代碼(C語言)
#include <stdio.h>
#include <stdlib.h>#define PAGE_SIZE 4096 // 頁大小4KB
#define PAGE_TABLE_SIZE 1024 // 頁表條目數// 頁表項結構
typedef struct {int valid; // 有效位int frame; // 物理頁框號
} PageTableEntry;PageTableEntry page_table[PAGE_TABLE_SIZE]; // 頁表// 初始化頁表
void init_page_table() {for (int i = 0; i < PAGE_TABLE_SIZE; i++) {page_table[i].valid = 0; // 初始化為無效page_table[i].frame = -1;}
}// 邏輯地址轉物理地址
int logical_to_physical(int logical_addr) {int page_number = logical_addr / PAGE_SIZE;int offset = logical_addr % PAGE_SIZE;if (page_table[page_number].valid) {return page_table[page_number].frame * PAGE_SIZE + offset;} else {printf("Page Fault! Page %d not in memory.\n", page_number);return -1; // 觸發缺頁中斷}
}int main() {init_page_table();// 模擬頁表映射:頁號2 -> 物理幀5page_table[2].valid = 1;page_table[2].frame = 5;// 測試地址轉換int logical_addr = 8192; // 頁號=2, 偏移=0int physical_addr = logical_to_physical(logical_addr);if (physical_addr != -1) {printf("Logical: 0x%x -> Physical: 0x%x\n", logical_addr, physical_addr);}return 0;
}
三、GDB調試步驟
-
編譯代碼:
gcc -g paging_demo.c -o paging_demo
-
啟動GDB:
gdb ./paging_demo
-
關鍵調試命令:
(gdb) break logical_to_physical # 在轉換函數設置斷點 (gdb) run # 運行程序 (gdb) print logical_addr # 查看邏輯地址值 (gdb) print page_number # 觀察計算的頁號 (gdb) x/4x &page_table[2] # 檢查頁表項內容 (gdb) step # 單步執行觀察分支跳轉 (gdb) print physical_addr # 查看轉換結果
-
調試輸出示例:
Breakpoint 1, logical_to_physical (logical_addr=8192) at paging_demo.c:23 23 int page_number = logical_addr / PAGE_SIZE; (gdb) print page_number $1 = 2 (gdb) x/4x &page_table[2] 0x4040a0 <page_table+16>: 0x00000001 0x00000005 # valid=1, frame=5
四、心得體會
-
分頁機制優勢:
-
消除外部碎片,提高內存利用率。
-
支持虛擬內存,通過缺頁中斷實現按需加載。
-
-
調試收獲:
-
直觀看到頁表項中
valid
位和frame
號的作用。 -
理解地址拆分和拼接的二進制操作本質。
-
-
性能思考:
-
單級頁表在大型系統中不現實(如32位系統需4MB頁表)。
-
TLB和層次頁表(如x86四級頁表)的實際必要性。
-
五、擴展實驗建議
-
修改代碼模擬缺頁中斷處理流程。
-
實現多級頁表(如二級頁表)。
-
添加TLB緩存模擬并比較命中率。
通過實際代碼和調試工具的結合,可以更深入地理解操作系統內存管理的核心機制。