GDT&LDT
GDT(Global Descriptor Table)全局描述符表 GDT是一个以 段描述符 为表项的数组类型的数据结构,在内存中线性存放。每个段描述符占 8 个字节。 GDTR寄存器存放GDT表的基地址和表长界限(高32位存放GDT基址,低16为存放GDT限长)。 指令LGDT和SGDT分别用于加载和保存GDTR寄存器的内容。在机器刚加电或处理器复位后,基地址被默认地设置为0,而长度值被设置成0xFFFF。在保护模式初始化过程中必须给GDTR加载一个新值。 段选择子(Segement Selector) 由GDTR访问全局描述符表是通过“段选择子”(实模式下的段寄存器)来完成的。段选择子是一个16位的寄存器(同实模式下的段寄存器相同)。 段选择子共16bit,由三部分组成: 描述符索引(index)、TI、请求特权级(RPL) 描述符索引(index): 在描述符表中定位一个段描述符。 TI: 描述符表指示器, TI=0 时,表示描述符在 GDT 中; TI=1 时,描述符在 LDT 中。 RPL: 请求特权级,表示给出当前选择子访问的内存段的特权级别。每一个段都有一个特定的级别。每当一个程序试图访问某一个段时,就将该程序所拥有的特权级与要访问的特权级进行比较,以决定能否访问该段。系统约定,CPU只能访问同一特权级或级别较低特权级的段。 因为每个描述符占 8 字节,因此描述符在表内的偏移地址是索引号乘以 8 处理器在执行任何改变段选择器的指令时(比如 pop、 mov、jmp far、 call far、 iret、 retf),就将指令中提供的索引号乘以 8 作为偏移地址,同 GDTR 中提供的线性基地址相加,以访问 GDT。 在表内找到的描述符,并加载到不可见的描述符高速缓存部分。此后每当有访问内存的指令时,就不再访问 GDT 中的描述符,直接用当前段寄存器描述符高速缓存器提供线性基地址。 段描述符(Segment Descriptor) 每个段描述符占 8 个字节。由三部分组成: 线性基地址、段界限和段的访问属性。 G: 粒度位,用于解释段界限的含义。当 G 位是"0"时,段界限以字节为单位。此时,段的扩展范围是从 1 字节到 1 兆字节( 1B~1MB),因为描述符中的界限值是 20 位的。 相反,如果该位是"1",那么,段界限是以 4KB 为单位的。这样,段的扩展范围是从 4KB到 4GB。...