欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

保护模式3-段描述符属性

程序员文章站 2022-05-08 16:01:26
...
  • 段寄存器位96位但是可见位数只有16位,剩下80位怎么填充?80位里每一位代表什么意思?

保护模式3-段描述符属性
上面为段描述符的结构

  • P(15):
    - P=1 段描述符有效
    - P=0 段描述符无效
  • G(23):
    我们先看看段描述符的结构
    Struct SegMent { WORD Select; //16位段选择子 WORD Attributes; //16位属性 DWORD Base; //32位基址 DWORD Limit; //32位段限长 }
    除去16位段选择子,剩下16位属性,32位基址,32位段限长,16+32+32为80位
    段基址位(0-8位+24-31位)[32位]+(16-31位)
    段限长16-19位+0-15位,只有20位,剩下的12位怎么填充呢?
    由G位来决定!
如果 G = 0,把段描述符中的LIMIT取出来,比如 0xfffff,然后在前面补 0 至32bit,即 limit = 0x000fffff
如果 G = 1,把段描述符中的LIMIT取出来,比如 0xfffff,然后在后面补 f 至32bit, 即 LIMIT = 0xffffffff
  • S(12):
    - S=1 代码段或者数据段描述符
    - S=0 系统段描述符
  • TYPE域(8-11)
    保护模式3-段描述符属性
P位	         DPL	     S位	              TYPE
15        14      13      12      11     10      9      8
1         1/0     1/0     1/0     1/0

p位为1时段描述符才有效
DPL只能同时为1或者同时为0
S位为1时才是代码段或者数据段
如果段描述符有效,且DPL为3的时候,还是代码段或者数据段的时候     那么12-15位(第五位)为F   00cf>f<300`0000ffff
如果段描述符有效,且DPL为0的时候,还是代码段或者数据段的时候     那么12-15位(第五位)为9   00cf>9<400`0000ffff
如果段描述符有效,且DPL为0的时候,是系统段描述符                那么12-15位(第五位)为8    00cf>8<000`0000ffff

---------------------------------------------------------------------
如果段描述符无效,P位为0,那么这个段描述符的>第五位<一定为0,并且12-15位小于等于7
---------------------------------------------------------------------

如果S位为1 (用户描述符-代码段-数据段描述符),11位为TYPE域的开头,决定了段描述符是代码段描述符
还是数据段描述符,如果11位为0则代表是数据段描述符,为1则代表代码段描述符
所以第六位如果为数据段(为0)时,则第六位肯定小于8
00cff>3<00`0000ffff		00cff>4<00`0000ffff 	 00cff>5<00`0000ffff
如果是代码段,11位为1,则第六位大于等于8
00cff>9<00`0000ffff		00cff>b<00`0000ffff		 00cff>a<00`0000ffff

----------------------------------------------------------------------
后面TYPE域3位属性将不会一一拆解,请对照Tbale 3-1对照,下面直接示范拆解
----------------------------------------------------------------------

如果拆解段描述符,以下为示例:
	----------------------------------------------------------------------------------------
	00cf>f<300`0000ffff
	其中第五位为F,则肯定P位为0,且DPL为11(3环),S位为也为1,肯定是一个用户段描述符
	00cff>3<00`0000ffff
	第六位为3(0011),查表的
	Decimal      11       10      9       8         Descriptor Type         Description
	   2         0        0       1       1               DATA              Read/Write,Accessed   
	  
	结论
	根据Tbale 3-1用户段描述符属性拆解得知,此段属性为用户段,DPL为3,用户可以访问,且是一个数据段描述符,可读可写,而且被访问过
	--------------------------------------------------------------------------------------------
	00cf>9<B00`0000ffff
	其中第五位为F,则肯定P位为0,且DPL为11(3环),S位为也为1,肯定是一个用户段描述符
	00cf9>A<00`0000ffff
	第六位为A(1010),查表的
	Decimal      11       10      9       8         Descriptor Type         Description
	   A         1        0       1       0               CODE              Executed/Read   
	  
	结论
	根据Tbale 3-1用户段描述符属性拆解得知,此段属性为用户段,DPL为3,用户可以访问,且是一个代码描述符,可读可执行
	------------------------------------------------------------------------------------
	 - 如果为0,则向上扩展
	 - 如果为1,则向下扩展```
 ![扩展属性位](https://img-blog.csdn.net/20180914145123130?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1NDI1MjQz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
 
 ```如果是代码段,描述符第六位(8-11位)中的第10位,为一致位(C位)```
 ```- 如果C为0,非一致代码段
     - 如果C为1,一致代码段```

-----------------------------------------------------------------------------------------------------------------------------------
```如果S为0的时候-该段描述符为系统描述符.系统描述符有分为以下类型```
![S位为0](https://img-blog.csdn.net/20180914150117636?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1NDI1MjQz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

 - 情况一:对CS段的影响
	 - 情况一:对CS段的影响
	 - D = 0 采用16位寻址方式
	 - 前缀67 改变寻址方式
	 - `67:8965 FF     MOV DWORD PTR DS:[DI+FFFF],ESP     //DI 16位`
 - 情况二:对SS段的影响
	 - D = 1 隐式堆栈访问指令(如:PUSH POP CALL) 使用32位堆栈指针寄存器ESP
	 - D = 0 隐式堆栈访问指令(如:PUSH POP CALL) 使用16位堆栈指针寄存器SP
	 - 隐式堆栈访问(比如PUSH EAX的时候,并没有动ESP寄存器,但是堆栈会自动变化)
 - 情况三:向下拓展的数据段
	 - D = 1 段上限为4GB
	 - D = 0 段上限为64KB

![DB位属性](https://img-blog.csdn.net/20180914151520507?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1NDI1MjQz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)