物理地址,虚拟地址,线性地址及逻辑地址

本博文为原创,遵循CC3.0协议,转载请注明出处:http://blog.csdn.net/lux_veritas/article/details/8271158

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


很多人搞不清楚这些地址的关系,看了本篇文章相信就会有一个比较清晰的理解


物理地址:这个是最容易理解的,计算机的主存以字节为单元进行组织,为方便CPU访问主存的任一单元而对物理内存单元进行编号,这个编号就是地址,即物理地址,即CPU通过地址总线可寻址的物理单元。

 

虚拟地址:给大家看一张图:

图一 

CPU产生一条虚拟地址,经过内存管理单元(MMU:MemoryManager Unit)进行地址翻译,得到主存上的一个物理地址,通过物理寻址完成实际的访存。虚拟地址到物理地址保持着一种映射关系,MMU负责解析这种映射关系,使CPU最终访问到实际存储在主存中的数据。

CPU通过两层地址翻译的过程得到一条物理地址:逻辑地址->线性地址,线性地址->物理地址。很多人马上会问逻辑地址和线性地址,别着急,下面会一一描述。

 

线性地址:要了解线性地址,先熟悉地址空间的概念。

地址空间(address space),是一个非负整数地址的有序集合:{0,1,2,…}。如果地址空间中的整数是连续的,就说它是一个线性地址空间。一个地址空间的大小,由构成该地址空间的最大位数决定。

现代操作系统为了实现对物理内存的最大使用以及进程资源的彼此隔离等功能,发明了虚拟地址空间的概念。每一个进程维护各自的虚拟地址空间,对于32位的地址空间,其最大可用大小为2^32B,即4GB。而该空间内的地址连续,故称为线性地址空间,该空间内的每一条地址均为一个线性地址。

由于现代操作系统采用分页机制,利用多级页表的方式管理虚拟地址空间,所以线性地址多被划分为多个区段,每个区段内的数值作为某一级页表内的偏移量,用与索引下一级页表。于是有了大家熟知的线性地址的结构:


图二


逻辑地址CPU产生的虚拟地址,即CPU指令中的一条用来指定操作数或指令的一条地址。

现代操作系统一个很重要的概念即保护模式,通过层层的保护,避免程序的越权执行。例如访问只读代码段、访问不存在的地址等。逻辑地址由以下两部分构成,16bit的段选择符和32bit的偏移量。通过段描述符判定相关权限等机制,完成相应的转化,转化为一条线性地址,用于通过分页机制进行物理寻址。下图为一条逻辑地址的构成,以及由逻辑地址翻译为线性地址的描述



图三


 

综上所述,几个地址之间的关系为:


图四


虚拟地址只是逻辑地址线性地址的一个统称,经过翻译转化成为物理地址,达到访存目的。


 

描述一下处于CPU寻址的关键路径上的步骤:

1.      CPU产生一条逻辑地址,送到MMU的地址翻译硬件中

2.      操作系统设置段选择符,找到逻辑地址所属段的段描述符,判断相关属性权限

3.      MMU中的地址翻译硬件根据段描述符中规定的段基址,加上逻辑地址中的Offset,转化成线性地址

4.      MMU利用线性地址查询TLB

5.      TLB命中则返回页表的内容(即某一物理地址),不命中则去主存中索引页表,如若主存中页表也不命中,去磁盘中查找。

6.      根据页表内容,获取物理地址。

 

注:

每一个页表项中存储的是下一级页表的物理基地址。

每一个TLB项中存储的是页表项。



Reference:

[1] IA-32 Architectures Software Developer's Manual 3A

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值