您的位置:首页 > 其它

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

2016-04-26 17:06 381 查看
虚拟地址、线性地址和物理地址的转换
一、虚拟地址
        包含在机器语言指令中用来指定一个操作数或一条指令的地址。这种寻址方式在80X86著名的分段结构中表现的尤为具体,它促使MS-DOS或Windows程序员把程序分成若干段。每一个逻辑地址都由一个段(segment)和偏移量(offset或displacement)组成,偏移量指明了从段开始的地方到实际地址的距离。

        也叫逻辑地址,是指由程序产生的与段相关的偏移地址部分。例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址,不和绝对物理地址相干。只有在Intel实模式下,逻辑地址才和物理地址相等(因为实模式没有分段或分页机制,Cpu不进行自动地址转换);逻辑也就是在Intel 保护模式下程序执行代码段限长内的偏移地址(假定代码段、数据段如果完全一样)。应用程序员仅需与逻辑地址打交道,而分段和分页机制对您来说是完全透明的,仅由系统编程人员涉及。应用程序员虽然自己可以直接操作内存,那也只能在操作系统给你分配的内存段操作。

二、虚拟内存
        在现在操作系统中,都使用了MMU(Memory Management Unit,内存管理单元)的存储管理技术,而MMU管理的地址是虚拟地址。虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。与没有使用虚拟内存技术的系统相比,使用这种技术的系统使得大型程序的编写变得更容易,对真正的物理内存(例如RAM)的使用也更有效率。

       有时我们也把逻辑地址称为虚拟地址。因为和虚拟内存空间的概念类似,逻辑地址也是和实际物理内存容量无关的。逻辑地址和物理地址的“差距”是0xC0000000,是由于虚拟地址->线性地址->物理地址映射正好差这个值。这个值是由操作系统指定的。

进程使用虚拟内存中的地址,由操作系统协助相关硬件,把它“转换”成真正的物理地址。这个“转换”,是所有问题讨论的关键。有了这样的抽像,一个程序,就可以使用比真实物理地址大得多的地址空间。(拆东墙,补西墙),甚至多个进程可以使用相同的地址,因为转换后的物理地址并非相同的。可以把连接后的程序反编译看一下,发现连接器已经为程序分配了一个地址,例如,要调用某个函数A,代码不是call
A,而是call 0x0811111111 ,也就是说,函数A的地址已经被定下来了。没有这样的“转换”,没有虚拟地址的概念,这样做是根本行不通的。

三、线性地址

       是逻辑地址到物理地址变换之间的中间层。程序代码会产生逻辑地址,或者说是段中的偏移地址,加上相应段的基地址就生成了一个线性地址。如果启用了分页机制,那么线性地址可以再经变换以产生一个物理地址。若没有启用分页机制,那么线性地址直接就是物理地址。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),页面存储与物理内存或硬盘上,操作系统通过维护一个页目录和一些页表来留意这些页表信息。
逻辑地址、线性地址和物理地址之间的变换过程如下图所示:

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: