段描述符与段选择子


段描述符与段选择子

段寄存器有96位,其中80位不可见,包括Base,limit,attribute。16位可见,即段选择子selector。

对段寄存器进行写入时,CPU根据段选择子到GDT表中寻找段描述符,段描述符共8字节,64位,CPU根据段描述符填充段寄存器。

那么问题就是,如何用64位的段描述符来填充80位的段寄存器呢?为了解决该问题,这就需要段描述符的P,G位。

BASE: 段基址,由上图中的两部分(BASE 31-24 和 BASE 23-0)组成

G:LIMIT的单位,该位 0 表示单位是字节,1表示单位是 4KB

由于Intel考虑向前兼容,我们会发现段描述符的结构比较混乱,东一块西一块的。Attribute在段描述符高4字节的8-23位,Base在段描述符的低4字节的16-31位,高4字节的0-7位和24-31位。上述两个属性没有数据丢失,段寄存器和段描述符内的位数是一样多的。而Limit在段寄存器内占32位,在段描述符内只有20位。

当G=0时,Limit的范围是0x00000000-0x000FFFFF,其中,段描述符的20位在低位,高位补0.

当G=1时,Limit的范围是0x00000FFF-0xFFFFFFFF,其中,段描述符的20位在高位,低位补F。

D/B: 该位为 0 表示这是一个 16 位的段,1 表示这是一个 32 位段

AVL: 该位是用户位,可以被用户自由使用

LIMIT: 段的界限,单位由 G 位决定。数值上(经过单位换算后的值)等于段的长度(字节)- 1。

P: 当P=1时,段描述符有效;当P=0时,段描述符无效。

DPL:段权限

S: 该位为 1 表示这是一个数据段或者代码段。为 0 表示这是一个系统段(比如调用门,中断门等)

TYPE: 根据 S 位的结果,再次对段类型进行细分。

二、段选择子

段选择子是一个16位的段描述符,段选择子格式,如图:

INDEX:在GDT数组或LDT数组的索引号(3~15位)

TI:Table Indicator,这个值为0表示查找GDT,1则查找LDT

RPL:请求特权级。以什么样的权限去访问段。

三.练习:

给出下列3个段选择子,从GTD表中查找对应的段描述符,然后填充到段寄存器中。

将段描述符填写到段寄存器结构体中(段选择子:23, 2B ,30 )

0x23 拆分为二进制为 : 0010 0011

RPL :11 (低2位)

TI :0 (第3位)

INDEX : 100 (3~15位)

表明查找GDT表,Index 是4。对应GDT表项是00cff300`0000ffff

WORD Selector: 23

WORD Atrribute: cff3

DWORD Base: 00000000

DWORD Limit: ffffffff

00cff300`0000ffff

base:0000-0000

atrribute:cff3 

1          1          0          0          1          1          1          1          1          1          1          1          0          0          1          1 

G        D/B  0   AVL   Li------------mi-------------t   P   D---P---L   S    T---------y--------p---------e 

limit:fffff   limit也是占32位的,但是这里的limit是可以在描述符中看到的只有20位,还有部分看不见的需要判断G位

当G=0时,Limit的范围是0x00000000-0x000FFFFF,其中,段描述符的20位在低位,高位补0.

当G=1时,Limit的范围是0x00000FFF-0xFFFFFFFF,其中,段描述符的20位在高位,低位补F。