物理内存与虚拟内存( 三 )


物理内存与虚拟内存

文章插图
 
六、逻辑地址、线性地址、物理地址和虚拟地址的区别1)逻辑地址(Logical Address):是指由程序产生的和分段相关的偏移地址部分 。例如,你在进行 C 语言指针编程中,能读取指针变量本身值( &操作 ),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址,不和绝对物理地址相干 。只有在 Intel 实模式下,逻辑地址才和物理地址相等(因为实模式没有分段或分页机制,CPU不进行自动地址转换),逻辑地址也就是在Intel保护模式下,程序执行代码的偏移地址(假定代码段、数据段如果完全相同) 。程序员开发应用程序时是需要和逻辑地址打交道,而不需要和分段和分页机制打交道,分段分页是系统编程人员要涉及的 。程序员虽然能直接操作内存,那也只能在操作系统给你分配的内存段操作 。
2)线性地址(Linear Address):是逻辑地址到物理地址变换之间的中间层 。程序代码会产生逻辑地址,或说是段中的偏移地址,加上相应段的基地址就生成了一个线性地址 。如果启用了分页机制,那么线性地址能再经变换以产生一个物理地址 。若没有启用分页机制,那么线性地址直接就是物理地址 。Intel 80386 的线性地址空间容量为 4G(2的32次方即32根地址总线寻址) 。
3)物理地址(Physical Address):是指出目前 CPU 外部地址总线上的寻址物理内存的地址,是地址变换的最终结果地址,也就是计算机安装的内存条大小 。如果启用了分页机制,那么线性地址会使用页目录和页表中的项变换成物理地址 。如果没有启用分页机制,那么线性地址就直接成为物理地址了 。
4)虚拟地址(Virtual Address):是指计算机呈现出要比实际拥有的内存大得多的内存量,每一个程序都用自己的虚拟内存,而且一般和物理内存大小一样 。因此允许程序员编写并运行比实际系统拥有的内存大得多的程序 。这使得许多大型项目也能够在具有有限内存资源的系统上实现 。一个恰如其分的比喻是,你要从深圳去北京,你不必拥有一列长度像从深圳到北京距离的火车,只需要有两段比火车稍长的铁轨就能完成这个任务,在火车行驶时,只要铺铁轨的动作足够快,就可以使用两段铁轨交替铺在路上的办法使火车从深圳行驶到北京,让火车就像行驶在一条铁路上一样 。这也就是虚拟内存管理需要完成的任务 。在linux 0.11内核中,给每个进程都划分了总容量为64MB的虚拟内存空间 。因此程序的逻辑地址范围是0x0000000到0x4000000 。有时我们也把逻辑地址称为虚拟地址 。逻辑地址和物理地址的差值是0xC0000000,是由于虚拟地址->线性地址->物理地址映射正好差这个值 。这个值是由操作系统指定的 。逻辑地址(或称为虚拟地址)到线性地址是由CPU的分段机制自动转换的 。如果没有开启分页管理,则线性地址就是物理地址 。如果开启了分页管理,那么系统程序需要参和线性地址到物理地址的转换过程 。具体是通过设置页目录表和页表项进行的 。
物理内存与虚拟内存

文章插图
 




推荐阅读