80386的段寄存器是16位的,存储的地址为逻辑地址(虚地址)。不过,这只是段寄存器的可见部分(visible portion)…没错,正如我们所想的,段寄存器还有不可见部分(invisible portion)。其中的可见部分其实是个16位的 Selector,可以被程序操纵。而不可见部分只能被处理器操作,处理器自动地从段描述符(segment descriptor)中取出 基地址、段大小容限、描述符类型 等一系列信息,并将其载入寄存器的不可见部分。所以给我们造成了段寄存器只有16位的假象。具体结构看下图
再说说上面提到的 Selector
Selector 是存入 段寄存器 的16位信息,它只是逻辑地址,并不是一些人想象的物理地址。这个 Slector 向CPU提供三种信息
Index: 从描述符表单的8192个描述符中选出一个
Table Indicator: 置0时表示从 全局描述符表单(GDT)中索引,置1时表示从局部描述符表单(LDT)中索引
Requested Privilege Level: 用于保护机制
描述符(Descriptor)也说一下
描述符向CPU提供从逻辑地址 映射到 线性地址所需的数据,不能由程序创建,而要靠 编译器、链接器、装入器甚至是操作系统来创建。其中包含如下信息:
BASE: 段在4GB线性地址中的位置
LIMIT: 段地址的大小,由如下规则决定
1. 当以 1byte 为单元时,段大小的容限为 1MB
2. 当以 4kbyte 为单元是,段大小的容限为 4GB
Granularity bit: 间隔尺寸位,指定控制 LIMIT 的"单元"。置 0 时,单元大小为 1byte;置 1 时,单元大小为 4 kbyte
TYPE: 用于区分不同的描述符
DPL: 描述符特权级别,用于保护模式
Segment-Present bit: 置 0 时,描述符在地址变换中不可用;置 1 时可用。基于段的虚拟内存管理的操作系统在下面情况下将该位置 0
1. 被段构架的线性地址不是通过换页机制映射的时候
2. 该段不在内存里
Accessed bit: 置 1 表示该段被访问过。换而言之,一个 selector 被载入到 段寄存器,或者被一个 selector 测试指令访问过,该位置 1


知道了描述符(Descriptor),理解描述符表(Descriptor Table)就简单了~
一个段描述符被存储在 全局描述符表(global descriptor table – GDT) 或者 本地描述符表(local descriptor table – LDT) 中。一个 描述符表 是一段内存阵列,以 8 byte 为单位,每 8 byte 存一个描述符表项。描述符表的大小是可变的,但不能超过 8192 (2^(13)) 个描述符。CPU 通过 GDTR 和 LDTR 寄存器,将描述符表放进内存。这些寄存器存储着描述符表在线性地址空间的基地址,还有段的大小限制。操作 描述符表寄存器 的指令为 LGDT SGDT 和 LLDT SLDT
转载请注明出处:http://www.jiayii.com/80386-segment-translation/
谢谢您的关注。 : @jiayisuse : jiayisuse#gmail.com


考试刚刚考过,微机原理。
[Reply]
jiayi Reply:
July 13th, 2009 at 17:13
@猫猫的园地,
我们微原里没有些东东。。。
[Reply]