您的位置:首页 > 其它

GDTR、LDTR、GDT、LDT的理解’

2017-03-22 13:27 288 查看
           网上关于GDT与LDT的内容很多,这里只是在别人的基础上加入了自己理解的内容,首先贴一段LDTR的百度百科说明:

          LDTR(Local Descriptor Table Register)即局部描述符表寄存器,为自intel 80386起引入的寄存器。其中存放内容由两部分构成,第一部分为16位的LDT(局部描述符表)段的段选择子;第二部分为LDT段的段描述符的内容,intel
80386起引入的寄存器。(保护模式下为32位,IA_32e模式下为64位)、段限、段的性质描述。当进程切换时,LDTR中自动载入新进程描述符的选择子(其实是该描述符在GDT中的索引),地址转换时,若相应段寄存器(DS,CS,SS,ES)TI=1时,会根据LDTR中的描述符选择子(索引)在GDT中找到LDT的描述符,该描述符中记录着LDT的基址,然后再根据相应段寄存器(保护模式下应该叫段选择子)的高13位(该段描述符在LDT中的索引)在LDT中找到该段的描述符,而段基址就在该描述符中,段基址+偏移地址=线性地址,然后在根据是否启用分页,把线性地址转换成最终的物理地址(具体转化过程不再本词条讨论范围,可参考其它资料),当cpu或者重启时,段选择子与段基址默认值为0,段限为0FFFFH(64KB)。

          这里面有一点对理解GDT和LDT至关重要:LDTR中装在的并不是LDT表的描述符,而是一个选择子,也就是一个索引值,该索引值指明了当前LDT表的描述符在GDT表中的位置。如果段寄存器的TI=1,则根据GDTR找到GDT表,然后根据LDTR在GDT中搜索到LDT的描述符,即找到LDT表的位置,然后根据段寄存器中存储的段选择子找到需要的段基址,注意LDT表中只有三个条项,LDT[0]为空LDT[1]为代码段基址,LDT[2]为数据段基址。
         全局描述符表GDT只有一张(一个处理器对应一个GDT),GDT可以被放在内存的任何位置,但CPU必须知道GDT的入口,也就是基地址放在哪里,Intel的设计者门提供了一个寄存器GDTR用来存放GDT的入口地址,程序员将GDT设定在内存中某个位置之后,可以通过LGDT指令将GDT的入口地址装入此寄存器,从此以后,CPU就根据此寄存器中的内容作为GDT的入口来访问GDT了。GDTR中存放的是GDT在内存中的基地址和其表长界限。



关于GDTR寄存器,段选择子,描述符具体内容请参考:
http://www.techbulo.com/708.html
4000
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: