现在的位置: 首页 > 综合 > 正文

段描述表Descriptor Table

2018年03月29日 ⁄ 综合 ⁄ 共 779字 ⁄ 字号 评论关闭

80386在保护模式下,一个地址空间是否可以被写入,可以被多少优先级的代码写入,是不是允许执行等涉及到保护的问题需要解决.要解决这些问题,必须对一个地址空间定义一些安全属性.段寄存器这时就派上用场.但是涉及的信息量太大,段寄存器无法存储,要用64位长的数据才能表示,我们把这64位的属性数据叫做段描述符Segment Descriptor.

 

由于段寄存器无法放下这64位的为数据,所以以如下方法解决.

将所有段的段描述符顺序放在内存中的指定位置,组成一个段描述符表Descriptor Table.用16位的段寄存器来做索引,指定这个段的属性是由段描述表中的哪个描述符指定的.此时称16位段寄存器为段选择器Segment Selector.

 

而段描述符表是由一个48位的全局描述符表寄存器GDTR和一个16位的局部描述符表寄存器LDTR来指定的.

 

GDTR指向GDT,GDT只有一个.

LDTR指向LDT.每个任务都有一个独立的LDT.LDTR存放指向LDT内存段对应描述符在GDT中的位置.

 

所以,GDTR是直接指向内存中GDT的地址的,而LDTR是索引.

 

选择器高13位表示索引值,第0,1位表示程序当前优选级RPL.第2位TI用来表示段描述符的位置.TI = 0 表示在GDT中,TI =1表示在LDT中.

 

索引过程:

 

TI = 0;

 

GDTR -> GDT -> 在GDT中,用段选择器高13位索引,得到段描述符,描述符中包含了基址,限长,优先级等属性,于是得到了段的基址.

 

TI = 1;

 

GDTR -> GDT -> 在GDT中,用LDTR作为索引,得到LDT的描述符a,描述符a中有LDT的信息,所以找到LDT -> 在LDT中,用选择器的高13位索引,得到段描述符b.

描述符b中有基址,限长,优先级等属性,于是得到了段的基址.

 

以上两种方法得到的基址后,再加上偏移地址,得到线性地址.

 

 

抱歉!评论已关闭.