逻辑地址(Logical Address) 是指由程序产生的与段相关的偏移地址部分。例如,你在进行C语言指针编程中,能够读取指针变量自己值(&操做),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址,不和绝对物理地址相干。只有在Intel实模式下,逻辑地址才和物理地址相等(由于实模式没有分段或分页机制,Cpu不进行自动地址转换);逻辑也就是在Intel 保护模式下程序执行代码段限长内的偏移地址(假定代码段、数据段若是彻底同样)。应用程序员仅需与逻辑地址打交道,而分段和分页机制对您来讲是彻底透明的,仅由系统编程人员涉及。应用程序员虽然本身能够直接操做内存,那也只能在操做系统给你分配的内存段操做。
线性地址(Linear Address) 是逻辑地址到物理地址变换之间的中间层。程序代码会产生逻辑地址,或者说是段中的偏移地址,加上相应段的基地址就生成了一个线性地址。若是启用了分页机制,那么线性地址能够再经变换以产生一个物理地址。若没有启用分页机制,那么线性地址直接就是物理地址。Intel 80386的线性地址空间容量为4G(2的32次方即32根地址总线寻址)。
物理地址(Physical Address) 是指出如今CPU外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果地址。若是启用了分页机制,那么线性地址会使用页目录和页表中的项变换成物理地址。若是没有启用分页机制,那么线性地址就直接成为物理地址了。
虚拟内存(Virtual Memory) 是指计算机呈现出要比实际拥有的内存大得多的内存量。所以它容许程序员编制并运行比实际系统拥有的内存大得多的程序。这使得许多大型项目也可以在具备有限内存资源的系统上实现。一个很恰当的比喻是:你不须要很长的轨道就可让一列火车从上海开到北京。你只须要足够长的铁轨(好比说3千米)就能够完成这个任务。采起的方法是把后面的铁轨马上铺到火车的前面,只要你的操做足够快并能知足要求,列车就能象在一条完整的轨道上运行。这也就是虚拟内存管理须要完成的任务。在Linux 0.11内核中,给每一个程序(进程)都划分了总容量为64MB的虚拟内存空间。所以程序的逻辑地址范围是0x0000000到0x4000000。
有时咱们也把逻辑地址称为虚拟地址。由于与虚拟内存空间的概念相似,逻辑地址也是与实际物理内存容量无关的。
逻辑地址与物理地址的“差距”是0xC0000000,是因为虚拟地址->线性地址->物理地址映射正好差这个值。这个值是由操做系统指定的。
虚拟地址到物理地址的转化方法是与体系结构相关的。通常来讲有分段、分页两种方式。以如今的x86 cpu为例,分段分页都是支持的。Memory Mangement Unit负责从虚拟地址到物理地址的转化。逻辑地址是段标识+段内偏移量的形式,MMU经过查询段表,能够把逻辑地址转化为线性地址。若是cpu没有开启分页功能,那么线性地址就是物理地址;若是cpu开启了分页功能,MMU还须要查询页表来将线性地址转化为物理地址:
逻辑地址 ----(段表)---> 线性地址 — (页表)—> 物理地址
不一样的逻辑地址能够映射到同一个线性地址上;不一样的线性地址也能够映射到同一个物理地址上;因此是多对一的关系。另外,同一个线性地址,在发生换页之后,也可能被从新装载到另一个物理地址上。因此这种多对一的映射关系也会随时间发生变化。