参考Intel的手册:
LLDT r / m16
其中r / m16是一个segment selector,这个selector指向的是LDT所在的数据段在GDT中的位置,所以,你就必须把LDT所在的段抽象成一个segment descriptor,然后把这个descriptor放到GDT里面去。
当然,也可以换一种说法。LDT其实可以理解成是系统的一个数据段,这个数据段在加载的时候要通过GDT来索引。而GDT则不能理解成一个数据段,把它理解成是一个系统的表格,因为在加载GDT的时候,需要提供的是limit和base address。
只有第一次加载任务专署的LDT的时候,才牵扯到从GDT中读取LDT信息的过程,而LDT一旦被加载到LDTR中,那么,段寄存器中的selector中的TI标志就会直接决定从什么位置来读取内存了。
在Intel的手册Volume 3A 2.4里面写的很清楚,当通过LLDT加载了LDT后,LDT的base address、limit以及attribute会自动加载到LDTR中。一旦任务的LDT加载后,就不再和GDT有关系了。之和selector中的TI有关系了。
总结:
从LDT定位数据分两步进行:
1、加载LDTR(由LLDT r / m16 完成)。
2、根据段选择子从LDT中定位数据(参见段选择子介绍)。