段描述符与段选择子
段描述符与段选择子
段寄存器有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。