x86 番外三:描述符和选择子
在实模式下,段的基地址直接由段寄存器存储,一个段最大是 64 KB(即 65536 字节)。
切换到保护模式后,段寄存器不再直接存储段基地址,而是存储 选择子(Selector),而真正的段信息(如基地址、段限长、特权级、类型等)则保存在 描述符(Descriptor) 中,这些描述符集中存放在 全局描述符表(GDT) 或 局部描述符表(LDT) 中。
这样做是出于这样几个关键的目的:
- 保护模式的核心是 “保护” ——防止程序越界访问或破坏系统或其他进程。因此,段描述符规定该段最大可访问偏移;特权级用于控制哪些代码可以访问该段;通过 Type 规定只读/可写/可执行等属性
- 支持虚拟内存与多任务
- 使用缓存(描述符缓存)优化效率
- 所有段的元数据集中存放,便于操作系统统一管理
除了段,门(Gate)、任务状态段(TSS)等也是通过描述符来进行描述,通过选择子进行调用。
所以,很有必要好好梳理一下描述符和选择子机制。本篇是 x86 架构的番外篇,目标是理清「描述符」和「选择子」的本质。
