一、逻辑地址(有时也称虚拟地址)
逻辑地址(Logical Address) 是指由程序产生的与段相关的偏移地址部分。
比如在C语言指针编程中,能够读取指针变量本身值(&操作)。实际上这个值就是逻辑地址,它是相对于当前进程数据段的地址,和绝对物理地址无关。
仅仅有在Intel处理器的实模式下,逻辑地址才和物理地址相等(由于实模式没有分段或分页机制,CPU不进行自己主动地址转换)。逻辑地址也就是在Intel 处理器的保护模式下,程序执行代码段限长内的偏移地址(假定代码段、数据段全然一样)。CPU启动保护模式后,程序执行在虚拟地址空间中。注意,并非全部的“程序”都是执行在虚拟地址中。CPU在启动的时候是执行在实模式的。Bootloader以及内核在初始化页表之前并不使用虚拟地址,而是直接使用物理地址的。
应用程序仅需与逻辑地址打交道,而分段和分页机制仅系统编程涉及,应用程序尽管能够直接操作内存。可是也仅仅能在操作系统分配的内存段中操作。注:
实模式:指寻址採用和8086同样的16位段和偏移量。最大寻址空间1MB(20根地址总线寻址),最大分段64KB(寄存器为16位)。能够使用32位指令,32位的x86 CPU用做快速的8086。保护模式:寻址採用32位段和偏移量,最大寻址空间4GB,最大分段4GB (Pentium Pre及以后为64GB)。在保护模式下CPU能够进入虚拟8086方式,这是在保护模式下的实模式程序执行环境。
二、线性地址 线性地址(Linear Address)是逻辑地址到物理地址转换的中间层。
程序代码经编译后会产生逻辑地址,或者说是段中的偏移地址,加上对应段的基地址就生成了一个线性地址。
若启用了分页机制,则线性地址会再此转换产生一个物理地址。若没有启用分页机制。则线性地址就是物理地址。Intel 80386的线性地址空间容量为4G(2的32次方,即32根地址总线寻址)。
三、物理地址物理地址(Physical Address)是指出如今CPU外部地址总线上的寻址物理内存的地址信号,是地址变换的终于地址。若启用了分页机制,则线性地址会使用页文件夹和页表中的项转换为物理地址。
若没有启用分页机制。则线性地址直接就是物理地址。
四、虚拟内存
虚拟内存(Virtual Memory)是指计算机呈现出比实际拥有的内存大得多的内存量。因此它同意程序猿编写并执行比实际系统拥有的内存大得多的程序。这使得很多大型项目也能够在具有有限内存资源的系统上实现。一个非常恰当的比喻是:你不须要非常长的轨道就能够让使列火车从上海开到北京,仅仅须要比較长的两段铁轨(比方说3公里)就能够完毕这个任务。採取的方法是把后面执行过的的铁轨立马铺到火车的前面,仅仅要操作的足够快列车就能像在一条完整的轨道上执行一样。这也就是虚拟内存管理须要完毕的任务。在Linux 0.11内核中,为每一个“程序”(进程)都划分了总容量为64MB的虚拟内存空间。因此程序的逻辑地址范围是0x0000000到0x4000000。有时我们也把逻辑地址称为虚拟地址,由于与虚拟内存空间的概念类似,逻辑地址也是与实际物理内存容量无关的。逻辑地址与物理地址的“差距”是0xC0000000。是由于虚拟地址->线性地址->物理地址的映射正好差这个值,这个值是由操作系统指定的。