在 Linux 中,程序经过编译后会生成 object file,这个文件是没办法直接运行的,还需要经过 link 和 load 阶段。在 load 阶段会通过系统调用创建逻辑地址空间,读取 link 后的 elf 文件加载到内存里,并设置其运行的地址空间为对应的逻辑地址空间。CPU 运行加载在内存中的程序,读取指令,生成 逻辑地址 (或者叫做虚拟地址)。
段选择器和段寄存器
在 x86 中需要区分 3 种地址:
- 逻辑地址:一个逻辑地址的内容表示一个操作数或者指令,逻辑地址本身由段选择符和段内偏移量组成。比如下图的指令 4,表示为 [CS:EIP],即 CS 表示段选择符,EIP 表示段内偏移量
- 线性地址:32bit 无符号数表达的连续地址
- 物理地址:CPU 往内存地址上发送的信号所表达的内存单元地址
它们的关系如图所示: