[操作系统] 逻辑地址、物理地址、线性地址、虚拟地址

17人阅读 评论(0) 收藏 举报
分类:

声明:本文转载自https://blog.csdn.net/prike/article/details/52722934

转载本文目的在学习,如涉及侵权,请留言博主删除本文


前言

    许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以内存容量虽然小,但还是可以容纳当时的程序。

    但随着图形界面的兴起还有用户需求的不断增大,应用程序的规模也随之膨胀起来,终于一个难题出现在程序员的面前,那就是应用程序太大以至于内存容纳不下该程序,通常解决的办法是把程序分割成许多称为覆盖块(overlay)的片段。覆盖块0首先运行,结束时他将调用另一个覆盖块。虽然覆盖块的交换是由OS完成的,但是必须先由程序员把程序先进行分割,这是一个费时费力的工作,而且相当枯燥,人们必须找到更好的办法从根本上解决这个问题。

    不久人们找到了一个办法,这就是虚拟存储器(virtual memory)。虚拟存储器的基本思想是程序,数据,堆栈的总的大小可以超过物理存储器的大小,操作系统把当前使用的部分保留在内存中,而把其他未被使用的部分保存在磁盘上。比如对一个16MB的程序和一个内存只有4MB的机器,操作系统通过选择,可以决定各个时刻将哪4M的内容保留在内存中,并在需要时在内存和磁盘间交换程序片段,这样就可以把这个16M的程序运行在一个只具有4M内存机器上了,而这个16M的程序在运行前不必由程序员进行分割。


虚拟地址空间

任何时候,计算机上都存在一个程序能够产生的地址集合,我们称之为地址范围。这个范围的大小由CPU的位数决定,例如一个32位的CPU,它的地址范围是0~0xFFFFFFFF (4G),而对于一个64位的CPU,它的地址范围为0~0xFFFFFFFFFFFFFFFF (64T),这个范围就是我们的程序能够产生的地址范围,我们把这个地址范围称为虚拟地址空间,该空间中的某一个地址我们称之为虚拟地址。与虚拟地址空间和虚拟地址相对应的则是物理地址空间和物理地址,大多数时候我们的系统所具备的物理地址空间只是虚拟地址空间的一个子集。

这里举一个最简单的例子直观地说明这两者:对于一台内存为256M的32bit x86主机来说,它的虚拟地址空间范围是0~0xFFFFFFFF(4G),而物理地址空间范围是0x000000000~0x0FFFFFFF(256M)。


物理地址

CPU地址总线传来的地址,由硬件电路控制其具体含义。物理地址中很大一部分是留给内存条中的内存的,但也常被映射到其他存储器上(如显存、BIOS等)。在没有使用虚拟存储器的机器上,虚拟地址被直接送到内存总线上,使具有相同地址的物理存储器被读写;而在使用了虚拟存储器的情况下,虚拟地址不是被直接送到内存地址总线上,而是送到存储器管理单元MMU,把虚拟地址映射为物理地址


逻辑地址

是在有地址变换功能的计算机中,访内指令给出的地址 (操作数) 叫逻辑地址,也叫相对地址,也就是机器语言指令中,用来指定一个操作数或是一条指令的地址。要经过寻址方式的计算或变换才得到内存储器中的实际有效地址即物理地址。一个逻辑地址由两部份组成,段标识符: 段内偏移量。段标识符是由一个16位长的字段组成,称为段选择符。其中前13位是个索引号,后面3位包含一些硬件细节 。


线性地址

逻辑地址到物理地址变换之间的中间层。在分段部件中逻辑地址是段中的偏移地址,然后加上基地址就是线性地址。是一个32位无符号整数,可以用来表示高达4GB的地址,也就是,高达4294967296个内存单元。线性地址通常用十六进制数字表示,值得范围从0x00000000到0xfffffff)程序代码会产生逻辑地址,通过逻辑地址变换就可以生成一个线性地址。如果启用了分页机制,那么线性地址可以再经过变换以产生一个物理地址。如果没有启用分页机制,那么线性地址直接就是物理地址。


虚拟地址

有些书中虚拟地址=逻辑地址,Linux下把虚拟地址=线性地址,所以这个定义要根据个人的学习环境来决定,不过这不会影响物理地址、逻辑地址和线性地址的定义(个人见解)。


地址映射:逻辑地址 -> 物理地址

CPU将一个逻辑地址转换为物理地址,需要进行两步:首先将给定一个逻辑地址(其实是段内偏移量),CPU要利用其段式内存管理单元,先将为个逻辑地址转换成一个线程地址,再利用其页式内存管理单元,转换为最终物理地址。这样做两次转换,的确是非常麻烦而且没有必要的,因为直接可以把线性地址抽像给进程。之所以这样冗余,Intel完全是为了兼容而
查看评论

逻辑地址、线性地址、物理地址和虚拟地址 概念与区别

逻辑地址、线性地址、物理地址和虚拟地址 本贴涉及的硬件平台是X86,如果是其它平台,嘻嘻,不保证能一一对号入座,但是举一反三,我想是完全可行的。 一、概念 物理地址(ph...
  • zsl091125
  • zsl091125
  • 2016-09-16 17:46:03
  • 342

虚拟地址,逻辑地址,线性地址,物理地址有什么区别

虚拟地址是由程序产生的由段选择符和段内偏移地址组成的地址。这两部分组成的地址并没有直接访问物理内存,而是要通过分段地址的变换处理后才会对应到相应的物理内存地址。 逻辑地址指由程序产生的段内偏移地...
  • u011101683
  • u011101683
  • 2013-10-08 21:22:24
  • 2309

linux内存管理---虚拟地址、逻辑地址、线性地址、物理地址的区别(一)

虚拟地址 、物理地址 、线性地址 、逻辑地址
  • yusiguyuan
  • yusiguyuan
  • 2013-07-31 10:55:45
  • 13400

逻辑地址、线性地址、物理地址和虚拟地址

  • 2010年01月23日 12:49
  • 47KB
  • 下载

逻辑地址、线性地址和物理地址的关系

、首先不得不提的历史          许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以内存容量虽然小...
  • prike
  • prike
  • 2016-10-02 10:03:42
  • 3302

逻辑地址,线性地址及物理地址的区别

  • 2017年10月31日 19:37
  • 175KB
  • 下载

逻辑地址、线性地址、物理地址区别

本文转自http://blog.csdn.net/erazy0/article/details/6457626一、逻辑地址转线性地址    机器语言指令中出现的内存地址,都是逻辑地址,需要转换成线性地...
  • u012323667
  • u012323667
  • 2016-08-31 22:56:03
  • 3769

逻辑地址到线性地址的转换

知识背景: 1、逻辑地址=段选择符+偏移量 2、每个段选择符大小为16位,段描述符为8字节(注意单位)。 3、GDT为全局描述符表,LDT为局部描述符表。 4、段描述符存放在描述符表中,也就是GDT或...
  • xuwq2015
  • xuwq2015
  • 2015-09-19 09:22:52
  • 902

逻辑地址、线性地址、物理地址以及虚拟存储器

Note:本文是基于80×86微处理器进行原理总结。 在内存地址上,我们要区分逻辑地址、线性地址以及物理地址这三个概念。 逻辑地址:包含在机器语言指令中用来指定一个操作数或者一条指令的地址。每...
  • ajfgurjfmvvlsfkjglkh
  • ajfgurjfmvvlsfkjglkh
  • 2015-10-07 10:38:51
  • 836

逻辑地址、线性地址、物理地址和虚拟地址的分析

  • 2013年09月05日 17:49
  • 278KB
  • 下载
    个人资料
    持之以恒
    等级:
    访问量: 1763
    积分: 493
    排名: 10万+