Windows-保护模式-X86-段寄存器结构分析
段寄存器结构分析
一;段寄存器内部结构
段寄存器总共有96bit,可见部分16bit。

l Selector:16bit 可见部分,段选择子
l Attribute:16bit 不可见部分,表示段属性,表示了当前段寄存器是可读的还是可写的还是可执行的。
l Base:32bit 不可见部分,表示基址,段从那里开始
l Limit:32bit 不可见部分,表示基址的长度,base + limit 可以确定一个段的大小。
二;段寄存器种类
ES,CS,SS,DS,FS,GS,LDTR,TR……

三;Selector
Selector段选择子,本质上就是有一个数字值,主要作用是通过它来构建段寄存器当中的不可见部分。该部分内容功能如下图:

l Index:在GDT数组或LDT数组当中的索引号(3~15bit)
l TI:当TI=0则表示不可见内容存放在GDT表当中。TI=1,则在LDT表当中。(2bit)
l RPL:请求特权级。以什么样的权限区访问段。(0~1bit)
四;GDTR寄存器与LDTR寄存器
参考连接:
五;GDT表与LDT表
GDT表与LDT表当中保存这段描述符(即段寄存器当中不可见部分)其中GDT表的基址存储在GDTR寄存器当中,LDT表的基址保存在GDT表当中。由段寄存器当中的TI位来决定段寄存器当中的Attribute,Base,limit三个部分存储在GDT表当中还是LDT表当中。
六;段描述符
段描述符存储在GDT表或者在LDT表当中,总共64bit。主要结构如下图:

我们通过windbg来查看一下。
---------------------------------------------------------------------------
注释:段描述符高4字节对应图中上半部分32bit,低4字节对应图中下半部分32bit。
6.1;P属性
P属性在段描述符,位于高4字节,下标为15的位置。详细图下图:

P属性作业:
P=1 段描述符有效,P=0 段描述符无效。
6.2;G属性
G属性位置如下图:

G作用:
G=0,Limit 的单位是字节,意味着Limit最大的界限是000FFFFFH。
G=1,Limit 的单位是4KB,意味着Limit最大的界限是FFFFFFFFH。
6.3;S属性
S属性位置如下图:

S属性作用:
S=1,段描述符表示代码段或者数据段描述符。
S=0,段描述符表示系统段描述符。
6.4;TYPE属性
TYPE属性如下图:

TYPE属性的不同含义是根据S属性来决定的。当S=1时和S=0时,TYPE属性的含义时不相同的。
6.4.1;代码/数据描述符
当S=1时,表示该描述符号为代码描述符或者数据描述符。TYPE属性当中11位为0则表示数据段,为0则表示数据段。详细如下图:

数据描述符当中(S=1,TYPE11位=1)
l W表示是否可写,W=0表示不可写,W=1表示可写。
l A表示是否访问过,A=0表示代码没有加载过,A=1表示代码被加载过。

l E向下扩展位,E=0,表示向上扩展,E=1,表示向下扩展。

当S=1时,表示该描述符号为代码描述符或者数据描述符。TYPE属性当中11位为0则表示数据段,为1则表示代码段
l A访问位,A=0,没有访问,A=1,访问过
l R可读位,R=0,不可读,R=1,可读
l C一致位,C=1 一致代码段,C=0非一致代码段
6.4.2;系统段描述符
当S=0时,表示该符号位位系统段描述符。在系统段描述符当中不同的TYPE属性表示含义如下图:

6.5;DPL属性
该属性只有两种值,00和11。具体内容以后分解
6.6;D/B属性
D/B位置如下图:

D/B属性作用:
l 对CS段影响
n D=1,采用32bit寻址方式
n D=0,采用32bit寻址方式
l 对SS段影响
n D=1,隐式堆栈访问指令,使用16bit堆栈指针寄存器SP
l 向下扩展的数据段影响
n D=1,段上线为4GB
n D=0,段上线为64KB

七;段描述符对比段寄存器当中不可见部分
Base部分对应位置如下图:

Limit部分:

Attribute部分:
