1. Memory Management Overview

IA-32 架构的内存管理工具分成两部分 : 分段和分页 . 要访问段中的某个字节 , 必须提供字节的 逻辑地址 —- 段选择器 : 段内偏移 . 分段机制将逻辑地址转化为 线性地址 , 分页机制将线性地址转化为 物理地址 .

分段机制将处理器可寻址的内存空间 ( 线性地址空间 ) 分成较小的受保护的地址空间 , 成为 ; 分页机制用于虚拟化线性地址空间 , 用少量的物理内存和磁盘存储模拟一个大的线性地址空间 .

2. Segmentation

2.1. Segment Selector

段选择器是一个段的 16 位标识符 , 不直接指向段 , 而是指向定义段的段描述符 . 段选择器包含以下内容 :

  • Index ( bit 3:15 ) , 选择 GDT 或者 LDT 8192 个描述符中的一个 , 处理器将 index 乘以 8 ( 一个段描述符中的字节数 ) 的结果加到 GDT 或 LDT 的基地址 .
  • TI ( table indicator ) flag ( bit 2 ) , 指明使用的描述符表 , 清除选择 GDT , 设置选择 LDT .
  • Requested Privilege Level ( RPL ) ( bit 1:0 ) , 指明选择器的特权级 , 范围 0-3 , 0 最高 .

处理器不使用 GDT 中的第一项 , 指向该项的段选择器用作 “null segment selector” .

2.2. Segment Registers

处理器提供了 6 个段寄存器 , 程序要访问一个段 , 必须将段选择器加载到 6 个寄存器之一 ; 因此系统中的段只有 6 个可以立即使用 .

每个段寄存器都有 “可见” 部分和 “隐藏” 部分 ( 也被称为 “描述符 cache” 或 “shadow register” ) , 加载段选择器到段寄存器的可见部分时 , 处理器还会加载段描述符中的基地址 , 段限制 , 访问控制信息到隐藏部分 .

2.3. Segment Descriptors

段描述符是 GDT 或 LDT 中的一个数据结构 , 向处理器提供一个段的位置和大小 , 访问控制和状态信息 . 下图列出了段描述符的结构:

picture 8

其中 segment limit 指明段的大小 , 单位受 G 标志的影响 .