如何添加LDT到GDT中

 LDT=local descriptor table 是多任务的雏形。

(写给自己看的,路过的勿骂)

首先说明下GDT,gdt=global descriptor table。保护模式下的索引每个段的表。

gdt中每一项为一个entry称之为descriptor描述符,使用selectorXXX来进行保护模式下的运行(其实就是个偏移),这个表项的属性指示决定了该描述符该怎么使用。
比如数据段的属性的宏是:DA_RW,32位代码段的属性是:DA_C + DA_32.

其中还有一种entry属性称之为:DA_LDT.这就是LDT所在GDT中的属性。
可以把LDT想象成多任务中针对单个任务中的各个段的一个表。


如何添加呢?

  1. 首先写出这个ldt中所包含的所有段的定义。
  2. 对所有的这些段在ldt表中定义其descriptor数据结构。并相应的写出selectorXX,其中descriptor中的起始地址处可为0,即是为定义,当对所有的“描述符表”进行初始化的时候,再统一进行初始化。并且要注意在selector中的地址中要加上SA_TIL这个属性,代表这个selector是一个ldt的selector,这样在使用这个selector的时候,cpu就知道是在gdt中查找还是在当前ldt中查找了.
  3. 将这个ldt表所在的段加到gdt表中,属性为DA_LDT(为了好理解,都定义为宏),加上相应的选择子,这个ldt在gdt中的选择子不做属性变化。
  4. 在dt表格初始化的地方对所有这些新加的不乱是ldt还是gdt的段的基址进行初始化,然后各种必要操作进入保护模式。
  5. 在保护模式中使用ldt中的段的时候,先要将ldt表在gdt表中的selector加载到ldtr寄存器中。才能使用。这样cpu才知道当前ldt是哪一个/


你可能感兴趣的:(数据结构,c,table,任务,Descriptor)