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