菜鸟-创作你的创作

计算机内存探秘:物理存储器、地址空间与内存地址

计算机内存探秘:物理存储器、地址空间与内存地址下面从物理层到逻辑层,由浅入深地完整梳理计算机内存体系,帮助你理解“内存地址到底是什么”以及它与物理存储器的关系。1. 物理存储器(Physical Memory)物理存储器就是我们常说的 RAM(Random Access Memory),即内存条上的DRAM芯片。

特性说明
物理本质由数亿到数百亿个电容组成,每个电容代表 1 bit(带电=1,失电=0)
组织方式以二维阵列组织:行(Row)× 列(Column) + Bank + Rank + Channel
最小访问单位通常以 64 bit(8 字节) 为一拍(burst)读取
容量表示8GB = 8×10⁹ 字节 ≈ 2³³ 字节(实际 8×2³⁰ = 2³³ 字节)
物理地址每个字节在物理内存条上都有一个连续的编号,从 0 开始,到总容量-1 结束

举例:一台电脑有 16GB 内存,物理地址范围是 0 ~ 16,777,215,999(0x0 ~ 0x3FFFFFFF)2. 地址空间(Address Space)地址空间 是程序看到的虚拟地址范围,与物理内存完全解耦。

类型范围(64位系统常见)说明
物理地址空间0 ~ 2⁴⁸-1 或 2⁵²-1(取决于 CPU)实际 DRAM + 内存映射 I/O 区域
虚拟地址空间0 ~ 2⁶⁴-1(理论上)每个进程独享的 256TB(用户态)+ 256TB(内核态)地址空间
用户态地址空间通常 0 ~ 2⁴⁷-1(Linux x86_64)进程私有,MMU 映射到物理内存
内核态地址空间高地址部分(2⁴⁷ ~ 2⁶⁴-1)内核代码、数据、直接映射物理内存等

关键点:
64 位系统理论虚拟地址是 2⁶⁴ 字节(16EB),但实际 CPU 只用其中一部分(如 Intel x86-64 目前只用 48 位或 57 位)。3. 内存地址的三大概念对比

概念含义谁看到它?大小(64位 Linux 示例)是否连续?是否唯一?
物理地址(Physical Address)DRAM 芯片上的真实字节位置内存控制器、DMA取决于实际 RAM + MMIO(通常几十 GB)全局唯一
虚拟地址(Virtual Address)程序看到的地址(也叫线性地址)进程、编译器0 ~ 2⁶⁴-1(理论)进程内看似连续每个进程独立
逻辑地址(Logical Address)分段模式下的段内偏移(现代基本不用)很少用

现代操作系统(Linux/Windows)基本只用分页模式,所以逻辑地址 ≈ 虚拟地址。4. 虚拟地址 → 物理地址 的转换过程(MMU + 页表)

  1. CPU 发出虚拟地址(64 位)
  2. MMU(Memory Management Unit) 接收
  3. 根据页表(Page Table) 分级查找:
    • 4KB 页大小(最常见) → 虚拟地址拆成:VPN(虚拟页号) + Offset(页内偏移 12 位)
    • 页表项(PTE)记录:物理页框号(PFN) + 权限位 + 脏位 + 访问位 等
  4. 最终得到物理地址 = 物理页框基址 + 页内偏移
  5. 内存控制器访问 DRAM

Linux 常见 4 级页表(48 位虚拟地址):

64 位虚拟地址
┌───────────┬───────────┬───────────┬───────────┬───────────┬───────┐
│  63-48    │ 47-39     │ 38-30     │ 29-21     │ 20-12     │ 11-0  │
│  未使用   │ PML4 索引 │ PDP 索引  │ PD 索引   │ PT 索引   │ Offset│
└───────────┴───────────┴───────────┴───────────┴───────────┴───────┘

5. 为什么需要虚拟地址?(核心价值)

价值解释
隔离每个进程以为自己独占整个内存,互不干扰
地址空间扩展程序可使用远大于物理内存的地址(通过 swap/文件映射)
内存保护读/写/执行权限控制,防止非法访问
简化编程程序员无需关心物理地址,编译器统一使用虚拟地址
动态内存分配malloc/new 可以返回连续虚拟地址,即使物理内存碎片化
按需分页页面可延迟加载(懒加载),节省内存

6. 常见内存地址示例(64 位 Linux 系统)

地址类型示例地址(16 进制)含义
内核代码0xffffffff81000000内核起始地址
内核模块0xffffffffc0000000 附近可加载模块
进程栈顶0x7fff…(高地址)每个进程栈
0x555…(用户态低地址)malloc 分配的内存
共享库0x7f…libc.so 等
物理地址0x100000000 ~ 0x…实际 DRAM 位置(/proc/iomem 可看)

7. 总结:一句话概括物理内存是真实的硬件存储,虚拟地址是操作系统给每个进程编造的“假地址空间”,通过 MMU + 页表实现一一映射。物理地址 是真实的家,虚拟地址 是每个进程的“梦中情人”,MMU 是“媒婆”。如果你对以下任一细节感兴趣,我可以深入展开:

欢迎继续追问!

退出移动版