一、基本概念
1. 物理地址 (Physical Address)
-
定义:硬件内存芯片(如RAM)上的实际地址,CPU通过总线直接访问的物理位置。
-
特点:
-
唯一且固定,由内存硬件决定。
-
操作系统和用户程序通常不直接操作物理地址(由内存管理单元 MMU 自动转换)。
-
-
示例:内存条上第
0x0000FF00
字节的位置。
2. 虚拟地址 (Virtual Address)
-
定义:进程视角中的地址空间,由操作系统通过内存管理机制(如分页、分段)映射到物理地址。
-
特点:
-
每个进程拥有独立的虚拟地址空间(如32位系统的
0x00000000
到0xFFFFFFFF
)。 -
通过 MMU 转换为物理地址,实现内存隔离和保护。
-
-
示例:程序代码中访问的变量地址
0x0804A000
是虚拟地址。
3. 逻辑地址 (Logical Address)
-
定义:程序编译后生成的地址,通常由 段基址 + 偏移量 组成(在分段内存模型中)。
-
特点:
-
在x86架构中,逻辑地址通过 分段机制 转换为线性地址。
-
现代操作系统(如Linux/Windows)通常弱化分段,逻辑地址与线性地址等价。
-
-
示例:汇编指令
mov eax, [0x1234]
中的0x1234
是逻辑地址的偏移量。
4. 线性地址 (Linear Address)
-
定义:在分段机制后、分页机制前的中间地址。如果没有分段,线性地址等于逻辑地址。
-
转换过程:
-
逻辑地址 →(分段机制)→ 线性地址 →(分页机制)→ 物理地址。
-
-
特点:
-
在启用分页的系统中,线性地址需要通过页表映射到物理地址。
-
-
示例:分段后的地址
0x0804A000
可能是一个线性地址。
5. 绝对地址 (Absolute Address)
-
定义:直接指向物理内存位置的固定地址,无需任何转换。
-
特点:
-
常见于早期无虚拟内存的系统,或嵌入式系统的直接内存访问。
-
与物理地址等价,但更强调“无需计算”的固定性。
-
-
示例:BIOS固件中硬编码的地址
0xFFFF0
(CPU复位后执行的第一条指令地址)。
6. 相对地址 (Relative Address)
-
定义:相对于某个基址(如代码段基址、当前指令指针)的偏移量。
-
特点:
-
用于重定位和动态链接,使程序可以在不同内存位置加载。
-
程序中的跳转指令(如
jmp +0x20
)常用相对地址。
-
-
示例:可执行文件中某函数的偏移量
0x200
,实际地址为基址 + 0x200
。
二、核心关系链
程序视角:
逻辑地址 →(分段机制)→ 线性地址 →(分页机制)→ 物理地址
进程视角:
虚拟地址(逻辑地址的抽象) → 物理地址
硬件视角:
绝对地址(直接物理地址) vs. 相对地址(基于基址的偏移)
三、详细关系解释
1. 逻辑地址 → 线性地址 → 物理地址(x86 分段+分页模型)
-
逻辑地址(段选择符 + 偏移量):
程序编译后生成的地址,例如CS:0x1234
(代码段基址 + 偏移)。 -
分段机制:
通过段描述符表(GDT/LDT)将逻辑地址转换为 线性地址(段基址 + 偏移)。 -
分页机制:
通过页表将线性地址转换为 物理地址(实际内存位置)。
2. 虚拟地址 ≈ 线性地址(现代操作系统简化模型)
-
虚拟地址:
进程看到的连续地址空间(如0x08048000
),本质是逻辑地址的抽象。 -
现代系统:
采用平坦内存模型(段基址设为0),逻辑地址直接等于线性地址,再通过分页映射到物理地址。
虚拟地址 → 线性地址 → 物理地址(分段机制被弱化)。
3. 绝对地址 vs. 物理地址(固定与动态映射)
-
绝对地址:
直接指向物理地址的固定值(如0xFFFF0
),无需转换。 -
物理地址:
可能通过分页动态映射,而绝对地址是物理地址的子集(静态映射部分)。
4. 相对地址 → 逻辑地址(程序可重定位性)
-
相对地址:
基于基址的偏移(如jmp +0x20
),程序加载时基址被动态分配。 -
基址重定位:
相对地址加上基址后形成逻辑地址(或直接映射为虚拟地址)。
四、实际系统中的简化流程(现代操作系统)
-
进程视角:
使用 虚拟地址(如0x7FFF89AB
),由编译器生成。 -
操作系统视角:
通过页表将虚拟地址(即线性地址)转换为 物理地址。 -
硬件视角:
MMU自动完成虚拟→物理地址的转换,程序无需感知物理地址。
五、关键关系示意图
程序代码中的相对地址(偏移量) │ ▼ 逻辑地址(段选择符:偏移量) → 分段机制 → 线性地址 → 分页机制 → 物理地址 │ │ │ │ ▼ ▼ └─── 虚拟地址(进程视角)───────┘ 绝对地址(硬件固定地址)
六、不同场景下的关系总结
-
传统x86分段+分页:
逻辑地址 → 线性地址 → 物理地址,虚拟地址=线性地址。 -
现代平坦内存模型:
虚拟地址(逻辑地址) → 物理地址,分段机制被隐藏。 -
嵌入式系统/无MMU:
直接使用 绝对地址(物理地址),无虚拟地址概念。 -
动态链接/重定位:
相对地址 + 基址 → 逻辑地址,支持代码灵活加载。