Chinaunix首页 | 论坛 | 博客
  • 博客访问: 807747
  • 博文数量: 142
  • 博客积分: 3505
  • 博客等级: 中校
  • 技术积分: 1501
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-30 19:30
文章分类

全部博文(142)

文章存档

2012年(33)

2011年(109)

分类: LINUX

2012-09-12 22:32:37

GDT与LDT困惑!!!
起初,我是把这两个寄存器独立看待,但有些文档却是却说如果选择子的TI为1(ldt),那么就得把这个选择作为偏移到GDT表索引LDT的描述符,并得到基地址和段限然后放到LDTR的高速寄存器.

关于这么做的目的是不是让LDT是依赖于GDT的控制,也就是我要是把GDTR的描述符表给清空了,LDT则不可用了.
我理解的对吗?

======================================================

其实这个问题从LLDT这个指令理解起来更方便,参考Intel的手册:
LLDT r / m16
其中r / m16是一个segment selector,这个selector指向的是LDT所在的数据段在GDT中的位置,所以,你就必须把LDT所在的段抽象成一个segment descriptor,然后把这个descriptor放到GDT里面去。

当然,也可以换一种说法。LDT其实可以理解成是系统的一个数据段,这个数据段在加载的时候要通过GDT来索引。而GDT则不能理解成一个数据段,把它理解成是一个系统的表格,因为在加载GDT的时候,需要提供的是limit和base address。

如果你能明白上面的说法,那么对于
“我的意思是说从LDT中直接找到CS段和间接从GDT到LDT在到CS段有什么差别?”

这个问题,其实就不存在了,因为只有第一次加载任务专署的LDT的时候,才牵扯到从GDT中读取LDT信息的过程,而LDT一旦被加载到LDTR中,那么,段寄存器中的selector中的TI标志就会直接决定从什么位置来读取内存了。

在Intel的手册Volume 3A 2.4里面写的很清楚,当通过LLDT加载了LDT后,LDT的base address、limit以及attribute会自动加载到LDTR中。一旦任务的LDT加载后,就不再和GDT有关系了。之和selector中的TI有关系了。
阅读(3774) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~