内存管理

保护模式内存管理

一、内存寻址

内存是指一组有序字节组成的数组,每个字节有唯一的内存地址。

通常内存地址从0开始编址,对于80X86 CPU来说,其地址总线宽度为32位,因此一共有2^32个不同物理地址。即内存物理地址空间有4G,总共可以寻址4G字节的物理内存。80X86使用了一种称为段(Segment)的寻址技术。

  • 段选择符 16位,其中14位可以选择2^14次方即16384个段。
  • 段内偏移地址 32位,意味着每个段的长度可以达到4G。
  • 逻辑地址 48位,由段选择符和段内偏移地址组成。

二、地址变换

计算机中的物理内存是字节的线性数组,每个字节具有一个唯一的物理地址;程序中的地址是由两部分构成的逻辑地制。这种逻辑地址并不能直接用于访问物理内存,而需要使用地址变换机制将它变换或映射到物理内存地址上。内存管理机制即用于将这种逻辑地址转换成物理内存地址。

逻辑地址到物理地址的变换过程

分段机制总是启用,分页选用。

1. 分段

分段提供了隔绝各个代码、数据和堆栈区域的机制,因此多个程序(或任务)可以运行在同一个处理器上而不会互相干扰。

分段提供了一种机制,用于把处理器可寻址的线性地址空间划分成一些较小的称为段的受保护地址空间区域。段可以用来存放程序的代码、数据和堆栈,或者用来存放系统数据结构(例如TSS或LDT)。如果处理器中有多个程序或任务在运行,那么每个程序可分配各自的一套段。此时处理器就可以加强这些段之间的界限,并且确保一个程序不会通过访问另一个程序的段而干扰程序的执行。分段机制还允许对段进行分类。这样,对特定类型段的操作能够受到限制。

逻辑地址线性地址和物理地址之间的变换

为了定位指定段中的一个字节,程序必须提供一个逻辑地址。逻辑地址包括一个段选择符和一个偏移量。段选择符是一个段的唯一标识。另外,段选择符提供了段描述符表(例如全局描述符表GDT)中一个数据结构(称为段描述符)的偏移量。

每个段都有一个段描述符。段描述符指明段的大小、访问权限和段的特权级、段类型以及段的第1个字节在线性地址空间中的位置(称为段的基地址)。

逻辑地址的偏移量部分加到段的基地址上就可以定位段中某个字节的位置。因此基地址加上偏移量就形成了处理器线性地址空间中的地址。线性地址空间与物理地址空间具有相同的结构。相对于两维的逻辑地址空间来说,它们两者都是一维地址空间。虚拟地址(逻辑地址)空间可包含最多16K的段,而每个段最长可达4GB,使得虚拟地址空间容量达到64TB(246)。线性地址空间和物理地址空间都是4GB(232)。实际上,如果禁用分页机制,那么线性地址空间就是物理地址空间。

  • 段描述符 保存在描述符表中,逻辑地址中的段选择符定位其在表中的位置。指明段大小访问权限段特权级段类型段基址(线性地址空间中)

2. 段描述符表

段描述符表是段描述符的一个数组。描述符表的长度可变,最多可以包含8192个8字节描述符。有两种描述符表:全局描述符表GDT(Global descriptor table);局部描述符表LDT(Local descriptor table)。

段描述符表结构

当发生任务切换时,LDT会更换成新任务的LDT,但是GDT并不会改变。因此,GDT所映射的一半虚拟地址空间是系统中所有任务共有的,但是LDT所映射的另一半则在任务切换时被改变。系统中所有任务共享的段由GDT来映射。这样的段通常包括含有操作系统的段以及所有任务各自的包含LDT的特殊段。LDT段可以想象成属于操作系统的数据。

内存管理寄存器
  • GDTR GDTR寄存器中用于存放全局描述符表GDT的32位的线性基地址和16位的表限长值。
  • LDTR LDTR寄存器中用于存放局部描述符表LDT的32位线性基地址、16位段限长和描述符属性值。