虚拟地址、线性地址和物理地址的转换

虚拟地址、线性地址和物理地址的转换

一、 虚拟地址
即逻辑地址,是指由程序产生的与段相关的偏移地址部分。例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址,不和绝对物理地址相干。只有在Intel实模式下,逻辑地址才和物理地址相等(因为实模式没有分段或分页机制,Cpu不进行自动地址转换);逻辑也就是在Intel 保护模式下程序执行代码段限长内的偏移地址(假定代码段、数据段如果完全一样)。应用程序员仅需与逻辑地址打交道,而分段和分页机制对您来说是完全透明的,仅由系统编程人员涉及。应用程序员虽然自己可以直接操作内存,那也只能在操作系统给你分配的内存段操作。
二、 虚拟内存
在现在操作系统中,都使用了MMU的存储管理技术,而MMU管理的地址是虚拟地址,虚拟地址=逻辑地址=[段选择子]:[线形地址],利用段选择子找到描述符。虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。与没有使用虚拟内存技术的系统相比,使用这种技术的系统使得大型程序的编写变得更容易,对真正的物理内存(例如RAM)的使用也更有效率。
有时我们也把逻辑地址称为虚拟地址。因为和虚拟内存空间的概念类似,逻辑地址也是和实际物理内存容量无关的。逻辑地址和物理地址的“差距”是0xC0000000,是由于虚拟地址->线性地址->物理地址映射正好差这个值。这个值是由操作系统指定的。
三、 线性地址
是逻辑地址到物理地址变换之间的中间层。程序代码会产生逻辑地址,或者说是段中的偏移地址,加上相应段的基地址就生成了一个线性地址。如果启用了分页机制,那么线性地址可以再经变换以产生一个物理地址。若没有启用分页机制,那么线性地址直接就是物理地址。Intel 80386的线性地址空间容量为4G(2的32次方即32根地址总线寻址)。
四、 物理地址
物理地址 (physical address): 放在寻址总线上的地址。放在寻址总线上,如果是读,电路根据这个地址每位的值就将相应地址的物理内存中的数据放到数据总线中传输。如果是写,电路根据这个地址每位的值就将相应地址的物理内存中放入数据总线上的内容。物理内存是以字节(8位)为单位编址的。
五、 地址转换
完整的内存管理,包含保护和地址变换两个关键部分。80386的工作模式包括实地址模式和虚地址模式(保护模式)。Linux主要工作在保护模式下。 分段机制在保护模式下,80386虚地址空间可达16K个段,每段大小可变,最大达4GB。
提供保护措施可以防止一个任务访问另一个任务或者系统的内存区域。地址变换让操作系统在给任务分配内存时具有灵活性。为了减少确定地址变换所需要的信息,变换或映射通常是以内存块作为操作单位的。80X86从逻辑地址到物理地址变换中经过了两个阶段。第一阶段使用分段机制把程序的逻辑地址变换成处理器可寻址内存空间(称为线性地址空间)中的地址。第二阶段的分页机制把线性地址转换成物理地址。第一阶段的分段变换机制是必须使用的,但是第二阶段的分页机制是可选择的。如果没有开启分页机制,那么分段机制产生的线性地址空间就直接映射到处理器的物理地址空间上。
分段分页机制如下图所示:
这里写图片描述
1、 分段机制:
分段提供了隔绝各个代码、数据和堆栈区域的机制,因此多个程序(任务)可以运行在同一个处理器上而不会互相干扰。分段机制把处理器可寻址的线性地址空间划分成一些较小的称为段的受保护地址空间区域。为了定位指定段中的一个字节,程序必须提供一个逻辑地址,逻辑地址包括一个段选择符和一个偏移量,段选择符是一个段的唯一标识,同时还提供了段描述符表中一个数据结构的偏移量。
线性地址空间与物理地址空间具有相同的结构。相对于两维的逻辑地址空间来说,它们两者都是一维地址空间。虚拟地址空间可以包含最多16K个段,而每个端最长可达4GB,所以虚拟地址空间容量达到64TB(2^46)。线性地址空间和物理地址空间都是4GB(2^32)。实际上,如果禁用分页机制,线性地址空间就是物理地址空间。
每个段有三个参数定义:
(1)段基地址:指定段在线性地址空间中的开始地址,对应于段中偏移0处。
(2)段限长:是虚拟地址空间中,最大可用偏移位置,定义了段的长度。
(3)段属性:指定段的特性。例如是否可读、可写、段的特权等级等。
为了把逻辑地址转换成一个线性地址,处理器会执行以下操作(如下图):
(1)使用段选择符中的偏移值(段索引)在GDT或LDT表中定位相应的短描述符。(仅当一个新的段选择符加载到段寄存器中才需要这一步)
(2)利用段描述符检验段的访问权限和范围,以确保该段是可以访问的并且偏移量位于段界限内。
(3)把段描述符中取得的段机制加到偏移量上,最后形成线性地址。
这里写图片描述
2、分页机制
分页机制支持虚拟存储技术。在使用虚拟存储的环境中,大容量的线性地址空间需要使用小块的物理内存以及某些外部存储空间来模拟。使用分页时,每个端被划分为页面(通常每页4KB),页面存储与物理内存或硬盘上,操作系统通过维护一个页目录和一些页表来留意这些页表信息。
逻辑地址、线性地址和物理地址之间的变换过程如下图所示:
这里写图片描述

!!!保护模式下页的概念
1.在分页机制下,程序的线性地址空间和物理地址空间均是以页为单位来划分的,页长固定为4KB(80386以上 )或者4MB(Pentium)。
2.程序的线性地址空间由若干个连续的页组成,即逻辑页号是连续的。而每个逻辑页对应真正存放的物理页则可以不连续,操作系统只将空闲的可能不相邻的物理块(页)分配给要求进驻的程序。
3.将逻辑页号和其分配到的物理块号(页号)一一对应做成一张映射表,就是页表。
4.存储器的分页管理可以较好地控制内存碎片化,提高了内存利用率。
5.但当程序的最后一页装不满时,仍形成页内碎片。

!!!补充:逻辑地址转物理地址具体计算:

最近一直在学8086,上课老师突然问了个这。对于问题“8086 CPU 能提供20位的地址信息,可直接对1M个存储单元进
行访问,而CPU内部可用来提供地址信息的寄存器都是16位,那怎样用16位寄存器来实现20位地址寻址呢"明白了不少。

关于逻辑地址是允许在程序中编排的地址,8086的逻辑地址有段地值和段内偏移量两部分,表达形式为“段地址:段内偏
移地址”。
  逻辑地址和物理地址的转换?(期末考试会考的)

 之前说20位的地址信息可以对1M个内存单元进行访问,就是说编址00000H~FFFFFH,而段寄器CS,DS,SS,ES即存放了这些地址的高4位,如12345H,则某个段寄存器便会存储1234H高4位信息,这即为段地址。

   而段内偏移地址就是移动后相对于段地址的偏移量。
   物理地址就是地址总线上提供的20位地址信息。物理地址=段地址*10H+段内偏移地址。段地址乘以10H是因为段地址当时是取高四位得到的,所以还原后要让段地址左移4位(10H = 10000B),例如(cs)= 20A8H,(IP)=  2008H,则物理地址为20A8H*10H+2008H = 22A88H。

参考资料:赵炯 Linux内核完全注释V3.0&虚拟地址、线性地址和物理地址的转换&PPT

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值