2.1 存储器组织和段

物理存储器在80386系统下被组织成一个8位的字节序列。每个字节含有一个唯一的地址,从0到最大值2**32 -1(4G)。

然而,80386的程序与物理地址空间是相互独立的。这意味着写程序时可以不用关心有多少物理存储器,指令和数据在物理存储器中是如何存放的。

对应用程序可见的存储器组织模型是由系统软件设计者来决定的。80386的体系结构给予了设计者为每个任务选择一种模式的自由。存储器组织模型可以是下面几种:

  • “平坦”地址空间是由最多4G字节组成的单个数组。
  • 段地址空间可以由16,383个线性地址空间组成,每个4G。

两种模式均可以提供存储器保护。不同的任务可以使用不同的存储器组织模型。设计者使用存储器组织模型的准则和系统程序员使用什么方式来实现在第II部分-系统编程中讨论。

2.1.1 “平坦”模式

在“平坦”模式下,应用程序可以使用232(4G)字节的数组。尽管存储器可以是4G字节,但通常它们要小的多;处理器通过第5章介绍的地址变换将4G空间映射到物理存储器。应用程序不需要知道这些细节。

指向平坦地址空间的指针是一个32位序列数,从0到232 -1。单独编译模块的重定位由系统软件来做(例如,链接器,定位器,绑定器,加载器)。

2.1.2 段模式

在段模式下,应用程序可以使用更大的地址空间(称为逻辑地址空间)多达246(64T)字节的数组。尽管存储器可以是4G字节,但通常它们要小的多;处理器通过第5章介绍的地址变换将64T的地址空间映射到物理存储器(最多4G)。应用程序不需要知道这些细节。

应用程序可以把逻辑地址空间看作是16,383个一维子空间的集合,每个都有指定的长度。每个线性子空间被称作段。段是连续地址空间的一个单位。段大小可以从一个字节到最多232 字节(4G)。

这个地址空间的一个完整指针由两部分组成(见图2-1):

1.16位段选择符,标识一个段。

2.32位偏移,段内偏移地址。

在程序执行期间,处理器用段选择符和段的起始物理地址联系起来。单独编译的模块通过改变段基地址在运行时重定位。段大小是可变的;因此,段可以和它里面的模块大小相同。