当前位置:静雅生活网 > 健康小常识 >

物理地址查询(逻辑地址、线性地址和物理地址到底有什么不同?)

导读:在阅读操作系统相关书籍内存管理部分的时候,经常会看到这三个名词:逻辑地址、线性地址、物理地址,一般人都会有疑问,都是内存地址,搞出这么多名堂来,到底有什么区别,什

  在阅读操作系统相关书籍内存管理部分的时候,经常会看到这三个名词:逻辑地址、线性地址、物理地址,一般人都会有疑问,都是内存地址,搞出这么多名堂来,到底有什么区别,什么时候该用哪个?本文尝试解释这三个概念及不同点。

  先说一下前提,本文以intel的x86体系结构,以linux操作系统的实现为例,来说明这三个地址的概念和区别 。

  逻辑地址:是从intel提供的机制上来定义的,按照intel的实现,现在x86体系的CPU都工作在保护模式下,保护模式下对内存使用分段管理机制,使用分段机制来寻址。按照定义,逻辑地址=段描述符:段内偏移,这就是逻辑地址的含义。

  线性地址:又称虚拟地址,从逻辑地址的段描述符查表得出段的起始地址,再加上段内的偏移地址,就得到了线性地址。

  物理地址:从线性地址查页表,得到实际寻址物理内存硬件的地址。

  总结一下三个地址的关系,从总体上来说是这样的:

  逻辑地址 --> 线性地址 --> 物理地址,中间牵扯到的两个转换部件是由物理硬件实现的,分别是分段单元和分页单元。

  上两张图看得更清楚一些:

  

  

  上面这个内存管理和地址映射的机制是intel的设想,使用分段机制隔离不同进程的代码段和数据段,再使用分页机制实现进程地址到物理内存的映射。

  但是,linux并没有严格按照intel的设想这样使用,linux为了通用性在x86体系下,给所有的进程使用一样的段,所有的linux进程都使用相同的代码段和数据段,偏移范围都相同,根据上面的算法,线性地址等于逻辑地址的段起始地址+段内偏移,同样的段,同样的偏移范围,相当于所有的进程都使用相同的线性空间。

  这段话的意思相当于是说linux把intel的分段机制给糊弄过去了,在linux的实现下,逻辑地址的段描述符中描述的起始地址是0,偏移范围是整个地址空间,所以线性地址就等于逻辑地址的偏移地址,所有的进程都一样。

  线性地址到物理机制的映射,linux正常使用intel提供的分页机制来实现,系统在初始化时,将所有的物理地址按照固定大小,常见的是4KB为一个页,组织成一个物理页链表,表示系统中可用的内存资源。在进程要使用内存的时候,由内核将某一块线性地址映射到具体的某一页物理内存,将映射关系写在页表中,在实际访问时由分页单元进行转换。

版权声明:本文部分来自互联网,由小编精心所写,本文地址:http://www.zhubian88.cn/jkxcs/47870.html,如需转载,请注明出处!

联系我们

在线咨询:点击这里给我发消息

微信号:weixin888

工作日:9:30-18:30,节假日休息