首页/案例库/虚拟内存与分页机制
进阶操作系统

虚拟内存与分页机制

每个进程都以为独占了全部内存

虚拟内存让每个进程拥有独立的 64 位地址空间(理论 16EB),实际物理内存按需分配。分页机制将虚拟地址通过多级页表翻译为物理地址,TLB 加速翻译,缺页中断按需加载。理解这一机制是理解 mmap、共享库、内存泄漏的基础。

虚拟内存分页TLB缺页中断MMUmmap写时复制
STEP_1
用户空间和内核空间的分离是安全边界:用户程序无法直接访问内核内存,只能通过系统调用陷入内核态。内核空间在所有进程中映射到相同的物理地址,这让系统调用时不需要切换页表(提高性能),但也意味着内核漏洞可访问所有进程数据(Spectre/Meltdown 利用了此特性)。
进程的内存视图 — PROCESSING
address-space.log
// Linux 进程地址空间布局(64位,简化)
// 0x0000000000000000 - 0x00007fffffffffff  用户空间(128TB)
//   0x400000   代码段(.text)  只读可执行
//   0x600000   数据段(.data)  全局变量
//   堆(向上增长,malloc 从这里分配)
//   ...
//   mmap 区域(共享库 .so 映射在此)
//   ...
//   栈(向下增长,函数调用栈)
// 0xffff800000000000 - 0xffffffffffffffff  内核空间(128TB)

// 查看进程地址空间
// cat /proc/<pid>/maps
// 7f8a3b200000-7f8a3b400000 r-xp 共享库代码段
// 7f8a3b400000-7f8a3b600000 r--p 共享库只读数据
// 7ffe12345000-7ffe12367000 rw-p 栈
// [vdso]  内核快速系统调用映射

虚拟地址空间64 位系统中,每个进程看到的是 0 到 2^48(约 256TB)的连续虚拟地址空间,分为用户空间(低地址)和内核空间(高地址)。代码段、数据段、堆、栈、mmap 区域各占一段,互不重叠。实际物理内存远小于此,通过按需分配实现。

实时沙盒SANDBOX
FAULT_INJECTED
快速场景
手动调节
页大小
影响 TLB 覆盖范围和碎片
4KB 标准页,灵活但 TLB 覆盖范围小
TLB 条目数
TLB 容量决定命中率
1024
TLB 极小,频繁 Page Table Walk,性能崩溃
启用 Swap
物理内存不足时换出到磁盘