[windows内核]段描述符属性:S位_TYPE域
GDT表里的段描述符可以简单的分成两大类
1.代码或者数据段描述符
2.系统段描述符
怎么区分这个就需要靠S位
S = 1 代码段或者数据段描述符
S = 0 系统段描述符
我们先说S=1时候的情况,如果S位等于1那么他就是一个代码段或者数据段的描述符,我们怎么快速区分呢
首先,S位在高32位的第5个字节里,也就是和这几个属性看起来是一起的
我们首先前提条件就是P位是1,是有效的如果P位和S位都要同时为1那么满足条件的有以下两个(ps:DPL位只能全部为0(访问本段权限0)或者全部为1(访问本段权限3),这个属性以后再解释):
9=1001
F=1111
所以只有快速看高32位的第五个字节就能快速确定是否是有效段,是否是代码或者数据段
如果还想往后分析这个具体是代码段或者数据段就得看TYPE域属性
如果TYPE域第11位为0那么它就是一个数据段
如果TYPE域第11位为1那么它就是一个代码段
如果是这样,我们也能通过观察来快速确定是否是代码段和数据段
TYPE域在高32字节中的第6位,也就是这里
如果第11位为1,那第6个字节一定大于等于8它就是代码段,反正如果小于8那它就是数据段
如果是数据段那么它下面三位就代表了它的其他属性,我们一一来拆解
从表里看它是有四个属性分别是
Read Write accessed expand-down
A位(accessed):访问位,表示该位最后一次被操作系统清理后,该段是否被访问过,每当处理器将该段选择符置入某个寄存器时,就在该位置1
W位(Write):该段描述数据是否可写,如果可写则为1,反之为0
E位(expand-down):扩展方向,如果为1则是向下拓展的数据段,反之则不是,这里的下不是字面意思的下,下面来举个fs段寄存器的例子
简单的来理解,如果E位为0无效,那么FS段寄存器合法操作的范围就是fs.Base+Limit
如果E位为1有效,那么FS段寄存器合法操作范围就是除去fs.Base+Limit这段范围的其他范围
更简单来说如果E位为1有效那么段描述符的合法操作范围就是取反操作,这样更容易理解
ps:这里段拓展的大小还和DB位有关,但现在不在这里展开说。
如果是代码段
那么它也有四个属性,我们来拆解一下
Read accessed Execute conforming
A位(accessed):和数据段描述一致
R位(Read ):可读位
C位(conforming):一致位,C为1的时候为一致代码段(这里先不展开说)
如果S位是0 那么该描述符就是系统描述符,系统描述符又分为以下几类
可以根据TYPE域的数值来进行对应的查找,这里我们先不展开说系统描述符,只先理解怎么拆分和查找