一、分页机制核心原理
1.1 分页技术原理
核心思想:
将虚拟地址空间和物理内存划分为固定大小的页(Page),通过页表(Page Table)建立虚拟页到物理页框(Page Frame)的映射。例如,x86_64架构的4级页表结构:
虚拟地址: [63-48] | [47-39] PGD | [38-30] PUD | [29-21] PMD | [20-12] PTE | [11-0] 页内偏移保留位 全局目录 上层目录 中间目录 页表项
关键流程:
- CPU通过CR3寄存器定位页全局目录(PGD)
- 逐级查询页表项(PGD→PUD→PMD→PTE)
- 最终物理地址 = 物理页框号 << 12 + 页内偏移
🚀 面试题1:分页和分段的主要区别是什么?
答案要点:
- 划分粒度:分页是固定大小(4KB),分段是逻辑单元(代码/数据段)
- 碎片问题:分页只有内部碎片,分段有外部碎片
- 地址空间:分页提供线性虚拟地址,分段是二维地址(段基址+偏移)
- 应用场景:分页是现代OS标准,分段用于嵌入式或特殊场景
1.2 多级页表设计
设计动机:
直接映射所有虚拟地址需要巨大页表(48位地址需256TB页表)。多级页表通过稀疏存储节省空间,仅分配实际使用的页表项。
Linux四级页表示例:
// 内核源码示例(arch/x86/include/asm/pgtable.h)
#define pgd_offset(mm, address) ((mm)->pgd + pgd_index(address))
#define p4d_offset(pgd, address) (p4d_val(*(pgd)) & _PAGE_PRESENT ? p4d_offset_pgd(pgd, address) : NULL)
// ... 类似定义pud_offset/pmd_offset/pte_offset
🚀 面试题2:为什么使用多级页表?计算48位地址空间单级页表的内存占用?
答案要点:
- 空间优化:单级页表需要 (2^{48} / 2^{12} \times 8B = 256TB)(不可行)
- 实际占用:四级页表仅分配进程实际使用的内存区域
- 计算示例:
若进程使用1GB内存,四级页表总大小 ≈ (1GB/2MB \times 4 \times 8B = 16KB)
二、分页技术的核心优势
2.1 内存保护与隔离
页表项权限位:
// 页表项标志位(arch/x86/include/asm/pgtable_types.h)
#define _PAGE_PRESENT BIT(0) // 页是否在物理内存
#define _PAGE_RW BIT(1) // 可写权限
#define _PAGE_USER BIT(2) // 用户态可访问
#define _PAGE_PWT BIT(3) // Write-Through缓存策略
#define _PAGE_NX