段描述表Descriptor Table

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中有基址,限长,优先级等属性,于是得到了段的基址.

 

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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值