小猪窝

我是一个小菜鸟

个人对GDT、GDTR、LDT、LDTR的理解

作者:lianxi1999        来源:http://hi.baidu.com/lianxi1999

GDT是全局描述附表,主要存放操作系统和各任务公用的描述符,如公用的数据和代码段描述符、各任务的TSS描述符和LDT描述符。(TSS是任务状态段,存放各个任务私有运行状态信息描述符)
LDT是局部描述符表,主要存放各个任务的私有描述符,如本任务的代码段描述符和数据段描述符等。
GDTR是一个长度为48bit的寄存器,内容为一个32位的基地址和一个16位的段限。其中32位的基址是指GDT在内存中的地址。
LDTR是局部描述符寄存器,由一个可见的16位寄存器(段选择子)和一个不可见的描述符寄存器组成(描述符寄存器实际上是一个不可见的高速缓冲区)。
这里加入我的理解:应为GDT中除了有段描述符之外还有LDT描述符,所以微处理器在GDT中寻址LDT时,也需要使用选择子,以保持与段描述符寻址的统一。
在这里还要引入一个段选择子的概念。段选择子是一个寄存器,高13位用来指示描述符在描述符表中的索引号,低两位是表示使用描述符的特权级别;另外一位(T1)是GDT和LDT的信号量,如果T1=0,则使用GDTR,如果T1=1,则使用LDTR。选择子将被装入段寄存器中。系统中的段寄存器共有六个:CS、SS、DS、ES、FS和GS。当选择子被装入段寄存器时,微处理器会自动将其对应的描述符装入描述符寄存器。
系统任务切换时,LDT切换,而GDT不切换(因为真个系统只有一个GDT),这时新任务的LDT描述符的选择子就被装入到LDTR中。

任务切换过程中,各个相关寄存器的变化?
当任务切换时,如果使用的是LDT,首先变化的是LDTR。段选择子被装入LDTR,同时LDT描述符自动被装入描述符寄存器。系统利用LDTR中的段选择子来定位LDT描述符在GDT中的位置。这里我不明白的是LDTR中的LDT描述符和GDT中的描述符是什么关系?为什么要这样做呢?自动装入到LDTR中的描述符到底是什么?从哪来?请高手指点!

为什么要有一个GDTR,并且GDTR的结构和LDTR不一样呢?
这主要是因为系统只有一个GDT,而GDT的描述符有不能存放在GDT中(LDT的描述符都存放在GDT中),所以就需要一个GDTR来指示GDT在内存中的位置。因为GDTR是直接指示内存地址,而LDTR主要指示LDT描述符在GDT中的位置和属性,所以GDTR和LDTR的结构也不同。

为什么在保护模式下的物理寻址空间是4G而虚拟地址是64T?
物理地址是4G是因为地址总线是32位的。
虚拟地址的情况比较复杂。具体分析如下:
保护模式下,一个任务的整个虚拟地址空间可以分为相等的两半,一半空间的描述符在全局描述符表GDT中,一半空的描述符在局部描述符表LDT中。并且由上可知,段选择子的位数是13位,即最多可以有8192个描述符,而每个LDT也最多可以包含8192个描述符。每个描述符描述的段的最大寻址范围都是32位的,即4G。所以所有任务的虚拟地址空间为:8192*4G*2=64T。
作者:lianxi1999        来源:http://hi.baidu.com/lianxi1999

段描述符的数据结构:

B31-B24&B23-B16&B15-B0是指段的基地址,L19-L16&L15-L0是指段限地址。
G指示段的长度单位,G=0表示字节,=1表示4k;D表示存取方式,=0表示16位,=1表示32位。
A表示是否能为系统软件使用;没有使用的一位强制为0;P位表示该段是否在内存中,=0时表示不在;
DPL有两位,是访问本段需要的权限;S位表示描述符的类型,=1表示系统,=0表示代码段或者数据段;type表示描述符描述的段的类型,与S位结合起了使用。
本图最下面一行位字节的位数标定。

最后插入一张intel 关于相关概念的一张图:

 
阅读更多
文章标签: 任务 数据结构
上一篇对各种类型网桥及其区别的概述
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭