Intel一共定义了三种表:
- 中断描述符表
- GDT
- LDT
首先来明确几个很基本的概念:
Segment 段
一个逻辑上连续的地址,里面存储的数据具有相似的属性,比如安全级别很相似
Segment Register 段寄存器
CPU的段寄存器又多个,比如SS CS DS等等,另外我们需要知道,在实模式下,段寄存器存储的是段在内存中的首地址,而在保护模式下,段的起始地址在段描述符里面,段寄存器里面存放的是选择子
Selector 选择子
在保护模式下,通过选择子可以索引到描述符,段选择子长16位,段选择子的高13位是描述符索引(Index)。所谓描述符索引是指描述符在描述符表中的序号
Descriptor 描述符
就是用来描述上面段的属性,可以找到段的基质
GDT是全局描述表,只能有一个,里面存啥玩意呢? 里面存的就是一个个描述符,比如
- 代码段描述符
- 数据段描述符
- TSS段描述符
那如何找到GDT呢?这就得通过GDTR了,GDT的长度是不确定的,GDTR保存了GDT的基址和大小
总之:
选择子从GDT确定描述符,描述符确定段基地址,段基地址与偏移之和就是线性地址。所以,虚拟地址空间中的由选择子和偏移两部分构成的二维虚拟地址,就是这样确定了线性地址空间中的一维线性地址