✅ 一句话概括
虚拟内存管理是操作系统提供的一种将 进程虚拟地址空间和实际物理内存 分离的机制,包含 地址映射、内存分配、页表管理、换页、保护与共享 等内容。
📦 虚拟内存管理主要包括哪些内容?
我们分为 6 大核心模块:
模块 | 描述 |
---|---|
① 地址空间划分 | 用户空间 vs 内核空间,虚拟地址布局 |
② 地址映射机制 | 页表、段页式、TLB、页目录、页表项(PDE/PTE)等 |
③ 页表管理 | 页表结构、映射维护、动态建立 |
④ 页面置换 | 页面不在内存时触发 page fault,进行换页(如 FIFO、LRU、CLOCK) |
⑤ 内存分配 | 物理页分配(伙伴系统)、虚拟空间分配(mmap、sbrk) |
⑥ 访问权限控制与共享 | 内存保护(读/写/执行)、共享内存、Copy-on-Write(COW)等 |
🔍 具体展开讲讲
① 虚拟地址空间划分
操作系统为每个进程提供独立的“虚拟地址空间”
典型的 32 位进程地址空间划分:
0x00000000 ~ 0xBFFFFFFF 用户空间(3GB)
0xC0000000 ~ 0xFFFFFFFF 内核空间(1GB)
内核隔离,用户进程无法访问内核区。
② 地址映射机制(页表 + TLB)
- 操作系统使用 页表 将虚拟地址 ↔ 物理地址进行映射
- 每次访问虚拟地址,会查询页表找到实际物理地址
- 使用 TLB(Translation Lookaside Buffer) 做页表缓存,加速查询
地址转换流程:
虚拟地址 = 页目录索引 + 页表索引 + 页内偏移
→ 页目录 → 页表 → 找物理页框
③ 页表管理
- 每个进程有自己的页表
- 页表内容包括每一页的:物理地址、权限位(P/R/W/U)、状态位(Present/Dirty/Accessed)
- 支持多级页表(如二级页表、四级页表)
④ 页面置换(Page Replacement)
当内存满了,需要从物理内存中“换出”某些页
常见算法:
- FIFO
- LRU
- CLOCK
- OPT(理论最优)
触发机制:Page Fault(缺页中断)
⑤ 内存分配机制
分两类:
✅ 虚拟地址空间分配(进程视角)
sbrk()
:分配堆(向上增长)mmap()
:映射匿名内存或文件内存段- 栈自动分配(向下增长)
✅ 物理页帧分配(系统视角)
- 使用 伙伴系统(Buddy Allocator)分配/合并物理页
- 页框回收时触发 OOM / 置换 / 缓存回收等机制
⑥ 访问控制与内存保护
- 每一页都有权限位(R/W/X/U)
- CPU 硬件支持:不允许非法访问(页错误)
- 支持:
- 写时复制(COW)
- 共享内存映射
- 执行权限控制(NX Bit)
✅ 图示结构一览(逻辑视角)
[进程的虚拟地址空间]
┌───────────────┐
│ 代码段(text) │
│ 数据段(data)│
│ 堆(heap) │← sbrk
│ ... │
│ 栈(stack) │← 自动分配
└───────────────┘
↓
[地址映射 → 页表 → 物理内存]
↓
[物理页帧、分配器、换页算法]
🧠 面试高能金句总结
虚拟内存管理是操作系统提供的内存抽象,既提升了内存使用效率,又隔离了进程地址空间。它通过页表完成地址映射,通过置换算法管理内存回收,并利用权限位进行访问控制,是现代系统运行的基础保障之一。
如果你想,我可以画出“地址转换流程图”或者“多级页表示意图”,让你面试/复习/笔记更直观!📊