微机原理==第二章16位和32位微处理器(7)

GDT:全局描述符表。一个系统只能有一个全局描述符表。
LDT:局部描述符表。可以有很多个,并且它本身的存储段放在GDT中。
GDTR:全局描述符表寄存器。存放的是全局描述符表GDT的基地址和16位的界限值。

其实说白了:这些绕来绕去,关键是看基地址的存放,知道基地址就可以根据基地址和偏移量就可以找到对应的段。所以观察基地址。

选择子:里面存放的是13位段描述索引和TI描述符指示标志(为0,就到全局描述符表里面找,为1就到局部描述符表里面找)和RPL请求特权级。通过选择子,我们能找到对应的段。

我们来看看GDTR结构:

再看一下段选择子(就是一个16位寄存器,(在实模式下就是段寄存器))结构:

我们要选择子:就是需要它的高13位,它乘以8,即为描述符在GDT或LDT中的偏移量。
段选择子包括三部分:描述符索引,TI,请求特权级RPL。他的index(描述符索引)部分表示所需要的段的描述符在描述符表的位置,由这个位置再根据在GDTR中存储的描述符表基址就可以找到相应的描述符。然后用描述符表中的段基址加上逻辑地址(SEL:OFFSET)的OFFSET就可以转换成线性地址,段选择子中的TI值只有一位0或1,0代表选择子是在GDT选择,1代表选择子是在LDT选择。请求特权级(RPL)则代表选择子的特权级,共有4个特权级(0级、1级、2级、3级)。

我们要描述符表中的描述符是需要它的段基址可以帮助我们找到一个段的基址,然后根据偏移量就可以找到操作数啦!

局部描述符表LDT:局部描述符表可以由若干张,每个任务可以有一张,我们可以这样理解GDT,LDT,GDT为一级描述符表,LDT为二级描述符表。

下面我们来看看GDTR,LDTR里面装的什么东西;

LDTR内容是一个段选择子:它是用来寻找LDT(LDT本身也是一段内存),这个LDT既然也是一段,那么他也有一个描述符,就放在GDT里面,LDTR里面就存放的是用来到GDT里面寻找的选择子。理解:通过LDTR里面的段选择子,再加上本来就知道的GDT的基址,就可以到GDT里面找到LDT的描述符,然后根据描述符提供的基址就可以找到对应的LDT。

下面看两个实例:
1.访问GDT:
①先从GDTR寄存器中获得GDT基址。
②然后再GDT中以段选择器高13位位置索引值得到段描述符。
③段描述符符包含段的基址、限长、优先级等各种属性,这就得到了段的起始地址(基址),再以基址加上偏移地址yyyyyyyy才得到最后的线性地址。

2.访问LDT:
①还是先从GDTR寄存器中获得GDT基址。
②从LDTR寄存器中获取LDT所在段的位置索引(LDTR高13位)。
③以这个位置索引在GDT中得到LDT段描述符从而得到LDT段基址。
④用段选择器高13位位置索引值从LDT段中得到段描述符。
⑤段描述符符包含段的基址、限长、优先级等各种属性,这就得到了段的起始地址(基址),再以基址加上偏移地址yyyyyyyy才得到最后的线性地址。

你可能感兴趣的:(linux,C语言)