虚拟内存与物理内存的对应关系
- 虚拟内存 每个进程拥有独立的4GB 虚拟地址空间,地址范围:0x00000000 ~ 0xFFFFFFFF
⚠ 虚拟地址不是真实物理内存地址,只是一套进程内的逻辑地址 - 物理内存
● 真实硬件内存,程序数据最终保存在物理内存
● 不同进程相同虚拟地址,可以映射到完全不同的物理地址,进程之间内存隔离互不干扰
● OS 通过页表完成虚拟地址 ↔ 物理地址的转换
虚拟内存的大小与地址划分(32 位 Windows)
整个 4GB 地址空间对半划分:
| 区域 | 地址范围 | 特性 |
|---|---|---|
| 用户空间(低2GB) | 0x00000000 ~ 0x7FFFFFFF | 每个进程独立,用户程序可操作 |
| 内核空间(高2GB) | 0x80000000 ~ 0xFFFFFFFF | 所有进程共享同一份内核空间 |
用户空间内部细分
- 前 64KB 空指针赋值区:0x00000000 ~ 0x0000FFFF,禁止访问,捕获空指针错误
- 用户模式可用区:0x00010000 ~ 0x7FFEFFFF,程序使用的地址区域
- 后 64KB 禁入保护区:0x7FFF0000 ~ 0x7FFFFFFF,紧邻内核空间,防止用户代码越界访问内核
管理粒度:4KB 一页,按需分配
只有真正访问虚拟地址时,才分配物理内存
VAD(虚拟地址描述符)
● WinDbg 命令:!vad,查看进程 VAD 树
● 一个 VAD 节点代表一段已经分配的虚拟地址区间,不在 VAD 树中的地址就是未分配
● 用途:排查内存泄漏、查看进程内存布局
物理内存
- 管理单位:4KB / 页,称为物理页
- 物理内存上限 = 机器实际内存条容量
公式:
物理页总数 = 物理内存总大小(KB) ÷ 4KB
物理内存总量(KB)=MmNumberOfPhysicalPages * 4 - WinDbg 查看物理页总数命令:
cpp
dd MmNumberOfPhysicalPages
取出数值为物理页数量,乘以 4 得到 KB 单位内存
32 位系统内存识别限制
● 硬件理论上限:32 位架构最多识别64GB 物理内存
● Windows 系统版本限制:
○ WinXP:最多识别 4GB(内核人为限制,可通过 Hook 补丁突破)
○ Windows2003 服务器版:可识别 4GB 以上内存
注意:架构本身不限制,是操作系统内核做的限制
页面交换文件 pagefile.sys
● 文件位置:C 盘根目录,默认隐藏系统文件
● 作用:物理内存不够时,把不活跃内存数据写入硬盘这个文件,腾出物理内存
● 程序可用内存 = 物理内存 + pagefile.sys 虚拟内存
● 设置入口:系统属性 → 高级 → 性能设置 → 高级 → 虚拟内存更改
✅区分:
● 进程 4GB:虚拟地址空间(逻辑地址)
● pagefile.sys:硬盘充当内存的交换文件,二者不是同一个东西
核心机制:按需分配 & 缺页异常
- 按需分配:申请虚拟地址,不会立刻分配物理页;只有访问的时候才分配物理内存
- 缺页异常触发:访问已经分配虚拟地址,但没有挂载物理页时触发缺页中断
- 缺页异常 OS 处理流程:
a. 校验虚拟地址合法性
b. 分配物理页,建立页表映射
c. 如果数据在 pagefile,从硬盘交换文件读取数据载入物理页
d. 返回用户程序继续执行,应用完全无感知 - 比喻:七个坛子八个盖 物理页数量少于虚拟内存对应的 "坛子",依靠局部性原理,不活跃页面换入磁盘,活跃页面放在物理内存,动态轮换

总结
- 每个进程独立 4GB 虚拟地址;内核空间所有进程共享
- 虚拟地址≠物理地址,页表负责映射,进程内存隔离
- 内存按 4KB 页管理,虚拟内存延迟按需分配物理页
- VAD 描述已分配虚拟地址,WinDbg !vad查看;MmNumberOfPhysicalPages查看物理页总数
- pagefile.sys 是硬盘交换文件,物理内存不足时换页,缺页异常对程序透明
- 32 位 CPU 理论可识别 64GB 内存;XP 系统内核限制仅识别 4GB