本文会以80x86架构,linux2.6为例,简单介绍内存的分段和分页机制。
1. 三种内存地址
关于内存地址,首先要了解它有三种,分别是
逻辑地址、线性地址和物理地址。
把逻辑地址转换为线性地址是由一个叫做分段单元的硬件电路完成的。
同样地,还有一个叫做分页单元的硬件电路负责把线性地址转换为物理地址。
那现在很明确地,当我们讨论分段的时候,就是讨论逻辑地址是如何转换成线性地址的。当我们讨论分页的时候,就是在讨论线性地址如何转换成了物理地址。
下面分开讨论分段和分页功能是如何实现。
2. 逻辑地址
介绍分段之前,先明确逻辑地址的构成分两部分:一个16位的段选择符,一个32位的偏移量。
其中段选择符由高到低是:13位index,1位TI,2位RPL。它们的作用在下文介绍。
3. 段选择符、段寄存器、段描述符
现在我们知道,段选择符是逻辑地址的一部分,为了方便找到段选择符,处理器提供了6个段寄存器,段寄存器的唯一目的就是存放段选择符。
段描述符有8个字节,负责描述段的特征,包括段的首字节的线性地址、段的最大长度、段的特权级、区分段是数据段还是代码段的标志位……一共9个字段。
段选择符和段描述符具有对应关系,那应该如何通过段选择符得到段描述符呢?答案是查找全局描述符表(