24-段描述符属性

1. 段描述符属性S位

S位用于指定描述符的类型,当S=0表示是一个系统段,S=1则表示是一个数据段或代码段,对于系统段我们将在后面介绍。

 

2. 段描述符属性Type域

Type字段有4位,用于指定描述符的子类型。对于Type来说,当S=1或0时,Type所表示的含义是完全不一样的,这里我们只讨论S=1的情况。对于数据段来说,Type有E,W,A三位;对于代码段来说,Type有C,R,A三位。

11位如果是0则表示该段是一个数据段,如果11位是1表示该段是一个代码段。

对于数据段和代码段来说,A位是已访问位,表示该段是否已经被访问过。A=1表示该段被访问过,A=0说明该段没有被访问过。通常操作系统刚启动的时候,该描述符是没有被加载过的,那么A位一定是0。

 

数据段:

E位:表示段的扩展方向,E=0表示向上扩展(即向高地址方向扩展),通常是普通的数据段;E=1表示向下扩展(也就是说向低地址方向扩展),通常是栈段。

 

W位:表示段是否可写,W=0的段是不可写,W=1的段是可写的。

 

代码段:

R位:表示代码段是否可读,R=0的段是不可读的,R=1的段是可读的

 

C位:是一致位,C=1表示一致代码段,C=0表示非一致代码段(后面会介绍)

 

3. 如何区分段描述符的类型

到这里,有同学可能会问我们怎么区分一个描述符是数据段或代码段,还是系统段呢?

一般会根据12-15位来判断,首先可以确定DPL的2位不是0就是1,因此我们只要关注S和P位都是1就行了,只要12-15位的组合是1001或者1111(十六进制为9或F),我们就可以确定是否是一个数据段或代码段了,对应到GDT表的段描述符中的第5位。

 

借助Type字段的8-11位我们还可以近一步区分段描述符是一个数据段还是代码段,对应到GDT表的段描述符中的第6位,数据段的Type字段最大值是7,而代码段的Type字段最小值是8,只要段描述符的第6位大于7的就是代码段。

现在我们已经会分析一个段描述符的是数据段还是代码段了,对于数据段和代码段的属性分析,相信你应该也会了。