IA-32内存管理机制

首先回顾几个关于内存管理的术语:

  • 多任务---处理器把时间片划分并分配给每个运行中的程序.
  • 段---一块供程序存放代码或者数据的长度不定的内存.
  • 分段---把多个内存段互相隔离的方法,使多个程序可以互相隔离地运行而不会干扰.
  • 段描述符---用来描述一个内存段的64位值,包含了段的基地址,访问权限,长度限制,段的类型和使用方式等信息.
  • 段选择子---存放在段寄存器(CS,DS,SS,ES,FS,和GS)里面的16位值.
  • 逻辑地址---一个段选择子和一个32位的偏移地址的组合.

线性地址
逻辑地址到线性地址的转换
      
多任务操作系统允许多个程序(任务)同时在内存中运行,每个程序拥有属于自己的唯一的数据空间.假设有三个程序,每个程序都在偏移地址200h处有一个变量,这三个变量是如何相互隔离的呢?答案是:IA-32处理器使用了一个经过一步或者两个步骤的过程把每个变量的地址转换到另一个唯一的偏移地址上去.
      第一步是把变量的段和偏移地址合成一个线性地址,线性地址有可能就是变量的物理地址,但是有些操作系统(如windows或者Linux)使用一种称为IA-32的分页技术,使程序能够使用比计算机中实际物理内存更多的线性地址空间.如果情况是这样,就要经过第二个步骤,使用页面转换的方法把线性地址转换到物理地址.
      首先来看看处理器是如何使用段和偏移地址来确定一个变量的线性地址的.每个段选择子指向描述符表里面的一个段描述符,段描述符包含了段的基址(起始地址),逻辑地址中的32位偏移地址和段的基址相加就得到了线性地址.


       线性地址:线性地址是一个介于0到FFFFFFFFh的32位整数,它代表内存中的一个位置.如果分页机制没有打开的话,那么线性地址实际上就是数据的物理地址.

 分页
      分页机制是IA-32系列处理器的一个重要特征,它使得计算机同时在内存中运行原本无法装入的一堆程序成为可能.在一开始,处理器仅仅装入程序的一部分,剩余的部分保留在磁盘上面.程序要用到的内存被划分成称为页的小块,通常每块的大小为4KB.运行每个程序的时候,处理器有选择地在内存中释放一些不用的页面,然后装入其他马上要被用到的页面.
      操作系统使用一个页面目录和一系列的页表来追踪内存中所有程序的页面使用情况.当一个程序尝试访问线性地址空间中的某个地址时,处理器自动把线性地址转换成物理地址,这个转换就称为页面转换.如果需要的页面尚未在内存中,处理器打断程序的执行并引发一个页面错误,操作系统捕获这个错误并在程序恢复运行前把所需的页面从磁盘复制到内存中.从应用程序的角度来看,页错误和页面转换时自动发生的.

 描述符表
      段描述符存在于两种类型的表中:全局描述符表(GDT)和局部描述符表(LDT).
      全局描述符表(GDT,Global Descriptor Table):系统中只存在一个全局描述符表,系统在处理器切换到保护模式时创建全局描述符表,表的基址存放在GDTR(全局描述符表寄存器)里面.表中的项目(段描述符)指向各个段.操作系统可以把所有程序都要使用的段存放在GDT中.
      局部描述符表(LDT,Local Descriptor Table):在一个多任务的操作系统中,每个程序或任务都有它自己的段描述符表.这个表称为局部描述符表(LDT).当前程序的LDT的基址存放在LDTR(局部描述符表寄存器)中.每个段描述符都包含了段在线性地址空间中的基址.

 段描述符的细节
      
段描述符中除了包含段的基址外,有些数据位定义了段的限长和段类型.代码段是一个只读段的例子,如果一个程序尝试去修改代码段的内容,那么处理器会产生一个页异常.段描述符中也包含保护级别,这样可以防止应用程序访问操作系统使用的数据.下面是段描述符中各个域的含义.
      基地址:一个32位的整数,定义了段在4GB的线性地址空间中的起始地址.
      特权级:每个段都有一个0-3级之间的权限等级,其中0级是最高级,通常被操作系统的核心代码所使用.如果一个低优先级(优先级数字大)的程序尝试去存取高优先级(优先级数字小)的段,那么处理器会产生一个异常.
      段类型:用来指明段的类型以及可以对这个段进行的访问方式,还有段的扩展方向(向上或向下).数据段(包括堆栈段)可以是只读或者是可读写的.可以向上或向下扩展.代码段可以仅仅是可执行的或者是可执行/可读的.
      段存在标志:这个数据位指明段当前是否在物理内存中存在.
      粒度标志:用来决定如何解释段限长域的数值,如果标志位清零,那么段限长的单位是字节.如果该标志位置位,那么段限长的单位是4096字节.
      段限长:一个20位的整数,表示段的长度.它根据粒度标志的值按下面的两种方式解释:

  • 1字节到1MB字节的段长度.
  • 4096字节到4GB字节的段长度.

页面地址转换

       当分页机制被允许的时候,处理器必须把32位的线性地址转换到32位的物理地址,在这个过程中要用到以下三个数据结构:

  • 页目录:一个最多包含1024个32位表项的页表地址表.
  • 页表:一个最多包含1024个32为表项的页地址表.
  • 页:一个4KB或者4MB的地址空间.

 为了简单起见,下面讨论中假设使用4KB的页.
      一个线性地址可以被分为三个部分:指向页目录的指针,指向页表的指针和在页中的偏移地址.页目录的起始地址存放在控制寄存器(CR3)中.如图所示,当线性地址被转换到物理地址的时候,处理器进行了以下的步骤.

  1. 线性地址代表线性地址空间中的一个位置.
  2. 以线性地址中10位的页目录域作为索引,从页目录表中得到页表入口项,页表入口项中包含了页表的基址.
  3. 以线性地址中10位的页表域作为索引,从页表入口项指定的表项中得到页在物理内存中的基址.
  4. 线性地址中12位的偏移地址域加上页的基址,就得到了操作数确切的物理地址.

       操作系统可以选择让所有的程序或任务使用同一个页目录,或者让每个任务使用单独的页目录,也可以混合使用两种方式.

转载于:https://www.cnblogs.com/lovelovelt/archive/2009/08/18/1548306.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值