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

本文介绍了Linux中逻辑地址、线性地址、虚拟地址和物理地址的区别和转换过程。逻辑地址是CPU执行时的中间地址,由段标识符和段内偏移量组成。线性地址是经过段式管理单元转换后的地址,对应页式管理单元转换前的地址。虚拟地址是程序中使用的地址,可超出物理内存范围。物理地址是内存芯片的直接寻址地址。Linux通过段式和页式管理单元将逻辑地址转换为物理地址,其中在Linux下,逻辑地址和线性地址通常一致。
摘要由CSDN通过智能技术生成

1、概念解释

物理地址:
  用于内存芯片级的单元寻址,与地址总线相对应。这个概念应该是这几个概念中最好理解的一个,但是值得一提的是,虽然可以直接把物理地址理解成插在机器上那根内存本身,把内存看成一个从0字节一直到最大空量逐字节的编号的大数组,然后把这个数组叫做物理地址,但是事实上,这只是一个硬件提供给软件的抽像,内存的寻址方式并不是这样。所以,说它是“与地址总线相对应”,是更贴切一些,不过抛开对物理内存寻址方式的考虑,直接把物理地址与物理的内存一一对应,也是可以接受的。也许错误的理解更利于形而上的抽像。

虚拟内存:
  这是对整个内存(不要与机器上插那条对上号)的抽像描述。它是相对于物理内存来讲的,可以直接理解成“不直实的”,“假的”内存,例如,一个0x08000000内存地址,它并不对就物理地址上那个大数组中0x08000000 - 1那个地址元素;有了这样的抽像,一个程序,就可以使用比真实物理地址大得多的地址空间。(拆东墙,补西墙,银行也是这样子做的),甚至多个进程可以使用相同的地址。不奇怪,因为转换后的物理地址并非相同的。
  ——可以把连接后的程序反编译看一下,发现连接器已经为程序分配了一个地址,例如,要调用某个函数A,代码不是call A,而是call 0x0811111111 ,也就是说,函数A的地址已经被定下来了。没有这样的“转换”,没有虚拟地址的概念,这样做是根本行不通的。
打住了,这个问题再说下去,就收不住了。

逻辑地址:
  可以认为是cpu执行程序过程中的一种中间地址。Intel为了兼容,将远古时代的段式内存的管理方式保留了下来,至于为什么会产生段式内存的管理方式,参见[2]。一个逻辑地址,是由一个段标识符加上一个指定段内的相对地址的偏移量,表示为[段标识符:段内偏移量],也就是说上面例子中的那个0x08111111应该表示为 [A的代码的段标识符:0x08111111] 这样才完整一些。

线性地址:
  线性地址,也即虚拟地址,如果逻辑地址对应的是硬件平台段式管理转换前的地址的话,那么线性地址则对应了硬件页式内存的转换

  • 11
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值