物理地址宽度 和虚拟地址宽度是两个不同层次的概念,它们的区别可以用一个非常贴切的比喻来理解:
把整个系统想象成一个巨大的图书馆:
- 虚拟地址(64位): 是图书目录 中的编号。
- 这个目录非常庞大,理论上可以有 2^64 个编号(这是一个天文数字:16 EB)。每个读者(进程)都觉得自己拥有完整且独立的目录。
- 位宽(64位) 决定了这个目录理论上能编多少号,它定义的是地址空间的"命名能力"。
- 物理地址(48位): 是图书馆实际的书架位置 。
- 图书馆实际只有 2^48 个物理书架格子(256 TB)。这已经非常巨大,但远小于目录的编号数量。
- 位宽(48位) 决定了实际上有多少个可用的物理存储单元。
详细对比
| 特性 | 虚拟地址(64位) | 物理地址(48位) |
|---|---|---|
| "是什么" | 进程看到的地址,是一个抽象的编号。 | 真实内存芯片(DRAM)上的电气信号线寻址的单元。 |
| 所处层次 | 软件层面(CPU的MMU使用)。 | 硬件层面(内存控制器、DRAM芯片使用)。 |
| 核心目的 | 为每个进程提供连续、独立、受保护的地址空间。实现隔离、共享和"虚拟内存"。 | 唯一标识物理内存中的每一个字节。 |
| 宽度决定什么 | 决定了单个进程理论上能寻址的空间上限(例如 16 EB)。这是一个逻辑上限。 | 决定了计算机最大支持多少物理内存(例如 256 TB)。这是一个物理上限。 |
| 地址转换 | 通过MMU和页表,映射到物理地址。 | 是转换的终点,直接送到内存总线。 |
| 为什么宽度不同 | 64位:为了极致的未来可扩展性和统一的架构设计(所有地址都用64位寄存器存储)。 | 48位 :是成本、功耗、硬件复杂度的工程折衷。目前及可预见的未来,256TB物理内存对绝大多数系统都绰绰有余。 |
两者的关系与协同工作
它们通过 MMU 和 页表 紧密联系:
- 进程视角 :一个程序使用
0x400000这样的虚拟地址加载指令。 - 地址转换 :CPU的MMU单元收到这个地址,查询当前进程的页表。页表就像一个"翻译字典",记录了
0x400000这个"目录编号"对应哪个"物理书架位置"。 - 物理访问 :假设页表显示它映射到物理地址
0x8000。MMU就将这个48位的物理地址发送到内存控制器,从而从真实的物理内存中读取数据。 - 关键点 :如果物理地址只有48位,这意味着页表中所有条目的"物理页帧号"字段只需要48位宽。64位的虚拟地址在转换过程中,其高位会被用于查找页表目录,最终被"翻译"或"截断"为一个48位的物理地址。
为什么ARM64通常用48位虚拟地址而不是64位?
你可能会问,既然虚拟地址寄存器是64位的,为什么通常只用48位?这是为了效率。
- 在48位虚拟地址布局中(如前所述),地址被平分为用户空间和内核空间(各128TB)。最高位比特(第47位)直接指明了这个地址属于用户空间(0)还是内核空间(1)。硬件可以借此快速进行权限检查。
- 如果使用完整的64位地址,页表的结构会变得更深(需要更多级),每次地址转换需要更多次内存访问,显著降低性能。48位是一个在地址空间大小(256TB对单个进程已完全足够)和转换效率之间的完美平衡点。
总结
| 概念 | 比喻 | 关键数字(例) | 核心思想 |
|---|---|---|---|
| 64位虚拟地址 | 巨大的、私有的图书目录编号空间。 | 2^64 = 16 EB (理论极限) | 抽象与隔离。为软件提供近乎无限的、安全的地址视图。 |
| 48位物理地址 | 图书馆实际的书架数量和位置。 | 2^48 = 256 TB (物理上限) | 物理资源限制。由硬件成本、设计和功耗决定的实际可用内存上限。 |
简单来说:64位虚拟地址宽度让每个进程都"感觉"自己拥有一个超级大的私人地址空间;而48位物理地址宽度则标明了这台计算机"实际拥有"的物理内存容量上限。 MMU负责在这两者之间进行翻译和调度。