段描述符属性P位和G位

前言:段描述符属性P位和G位笔记

自己在学习段描述符与段选择子的时候有提出一个问题,如下图所示,这个问题老师在段描述符属性P位和G位中提及

因为老师说段寄存器是有96位的,但是可以发现段描述符的64位再加上段选择子16位,实际总共才是80位,那剩下的16位是从哪里来的呢?

这里再来看下段描述符的结构

首先来看Attribute,段描述符里面对应的高字节第8-23位,一共16位。

继续来看Base,在段描述符里面分为三个部分,位于段描述符中的高字节24:31,高字节第7:0,低字节第31:16,一共32位。

还有Limit,段描述符里面由两部分组成,高字节16-19,低字节0-15,这里一共20位。

以上一共就有了16(selector)+16(attribute)+32(base)+20(limit) = 84,还剩下12位,问题其实存在于这个Limit中多出来的三位,这里继续来看Limit结构

这里好像就有点矛盾了,老师最一开始讲说limit是00000000-FFFFFFFF的,但是这里说的话看起来就只有00000-FFFFF,如果把这个加上去应该正好是96位了

这个Limit可以看到有20位,那么转成16进制也就00000-FFFFF,那么另外3个十六进制000-FFF去哪了?

这个Limit剩余的12位就是由其中的G位来进行决定

如果G位为0的话,那么段描述符中的Limit高12位就填充三个000,那么最大上限就是000FFFFF

如果G位为1的话,那么段描述符中的Limit低12位就填充三个FFF,那么最大上限就是FFFFFFFF

这里又可以重新看下相关的段寄存器中的Limit,可以看到都是FFFFFFFF,那么我们就可以说这些寄存器加载的段描述符中的G为则为1

总结下:段描述符原本只有64位,它是如何变成96位的?

其实可以发现其中就是通过复用了部分其中的位,最后成了96位,然后这里的Limit结构体还需要理解下,其中的高3个十六进制和低3个十六进制是根据段描述符中的G位来进行决定的!

这里学习段描述符P位和G位,下面先放一张关于段描述符结构体的图

段描述符属性P位

P位位于高字节的第15位

当P位为1的话,那么表示当前的段描述符则有效

当P位为0的话,那么表示当前的段描述符则无效

段描述符属性G位

G位位于高字节的第23位

这里的G位有什么用?根据老师所讲的我目前知道的G位则跟段描述符中的Limit有关系

如果G位为0的话,那么段描述符中的Limit高12位就填充三个000,那么就是0x00000000-0x000FFFFF

如果G位为1的话,那么段描述符中的Limit低12位就填充三个FFF,那么就是0x00000FFF-0xFFFFFFFF

课后练习

查GDT表 快速确定P位?

P位在高字节的第15位

查GDT表 快速确定G位?

G位在高字节的第23位

将段描述符填写到段寄存器结构体中

这里比如分析下0x2B

selector部分

0x2B -> 0000 0000 0010 1011 -> rpl:3 ti:0 index:5

kd> dq 8003f000
8003f000 00000000 00000000 00cf9b00 0000ffff
8003f010 00cf9300 0000ffff 00cffb00 0000ffff
8003f020 00cff300 0000ffff 80008b04 200020ab
8003f030 ffc093df f0000001 0040f300 00000fff
8003f040 0000f200 0400ffff 00000000 00000000
8003f050 80008954 9f000068 80008954 9f680068
8003f060 00009302 2f40ffff 0000920b 80003fff
8003f070 ff0092ff 700003ff 80009a40 0000ffff

索引为5的-> 80008b04 200020ab
段选择子 -> 2B

分析:

2B -> 0000 0000 0010 1011

rpl: 3
ti: 0
index:5

base: 80042000
attribute:008b
limit: b20ab g: 0

posted @ 2022-02-03 21:00  zpchcbd  阅读(597)  评论(0)    收藏  举报