保护模式3-段描述符属性
程序员文章站
2022-05-08 16:01:26
...
- 段寄存器位96位但是可见位数只有16位,剩下80位怎么填充?80位里每一位代表什么意思?
上面为段描述符的结构
- 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)
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)
上一篇: mongoDB安装配置
下一篇: 设置MySQL 允许外部访问