现在的位置: 首页 > 综合 > 正文

内核源码学习:段机制和描述符(一)

2018年01月24日 ⁄ 综合 ⁄ 共 2020字 ⁄ 字号 评论关闭

1.在80386段机制中,逻辑地址由两部分组成,即段部分(选择符)及偏移部分。

段是形成逻辑地址到线性地址转换的基础。如果我们把段看成一个对象的话,那么对它的描述如下:

(1) 段的基地址(Base Address):在线性地址空间中段的起始地址。

(2)段的界限(Limit):表示在逻辑地址中,段内可以使用的最大偏移量。

(3)段的属性(Attribute): 表示段的特性。例如,该段是否可被读出或写入,或者该段是否作为一个程序来执行,以及段的特权级等等。

段的界限定义逻辑地址空间中段的大小。段内在偏移量从0limit范围内的逻辑地址,对应于从BaseBase+Limit范围内的线性地址。在一个段内,偏移量大于段界限的逻辑地址将没有意义,使用这样的逻辑地址,系统将产生异常。另外,如果要对一个段进行访问,系统会根据段的属性检查访问者是否具有访问权限,如果没有,则产生异常。例如,在80386中,如果要在只读段中进行写入,80386将根据该段的属性检测到这是一种违规操作,则产生异常。

      图 2.9表示一个段如何从逻辑地址空间,重新定位到线性地址空间。图的左侧表示逻辑地址空间,定义了ABC三个段,段容量分别为LimitALimitBLimitC。图中虚线把逻辑地址空间中的段ABC与线性地址空间区域连接起来表示了这种转换。


2.9 逻辑线性地址转换

段的基地址、界限及保护属性,存储在段的描述符表中,在虚拟线性地址转换过程中要对描述符进行访问。段描述符又存储在存储器的段描述符表中,该描述符表是段描述符的一个数组,关于这些内容,我们将继续详细介绍。

2 描述符的概念

所谓描述符(Descriptor),就是描述段的属性的一个8字节存储单元。在实模式下,段的属性不外乎是代码段、堆栈段、数据段、段的起始地址、段的长度等等,而在保护模式下则复杂一些。80386将它们结合在一起用一个8字节的数表示,称为描述符 。80386的一个通用的段描述符的结构如图2.10所示。

                      2.10段描述符的一般格式

 

从图可以看出,一个段描述符指出了段的32位基地址和20位段界限(即段长)

第六个字节的G位是粒度位,当G=0时,段长表示段格式的字节长度,即一个段最长可达1M字节。当G=1时,段长表示段的以4K字节为一页的页的数目,即一个段最长可达1M×4K=4G

字节。D位表示缺省操作数的大小,如果D=0,操作数为16位,如果D=1,操作数为32位。第六个字节的其余两位为0,这是为了与将来的处理器兼容而必须设置为0的位。5个字节是存取权字节,它的一般格式如图2.11所示:

                                                             2.11 存取权字节的一般格式

 

7P(Present) 是存在位,表示段描述符描述的这个段是否在内存中,如果在内存中。P=1;如果不在内存中,P=0

DPL(Descriptor Privilege Level),就是描述符特权级,它占两位,其值为03,用来确定这个段的特权级即保护等级。

S(System)表示这个段是系统段还是用户段。如果S=0,则为系统段,如果S=1,则为用户程序的代码段、数据段或堆栈段。系统段与用户段有很大的不同,后面会具体介绍。

类型占3位,第三位为E位,表示段是否可执行。当E=0时,为数据段描述符,这时的第2ED表示扩展方向。当ED=0时,为向地址增大的方向扩展,这时存取数据段中的数据的偏移量必须小于等于段界限,当ED=1时,表示向地址减少的方向扩展,这时偏移量必须大于界限。当表示数据段时,第1(W)是可写位,当W=0时,数据段不能写,W=1时,数据段可写入。80386中,堆栈段也被看成数据段,因为它本质上就是特殊的数据段。当描述堆栈段时,ED=0W=1,堆栈段朝地址增大的方向扩展。

也就是说,当段为数据段时,存取权字节的格式如图2.12所示:

 

                 图 2-12 数据段的存取字节

当段为代码段时,第3E=1,这时第2为一致位(C)。当C=1时,如果当前特权级低于描述符特权级,并且当前特权级保持不变,那么代码段只能执行。所谓当前特权级(Current Privilege Level),就是当前正在执行的任务的特权级。第1位为可读位R,当R=0时,代码段不能读,当R=1时可读。也就是说,当段为代码段时,存取权字节的格式如图2.13所示:

 

                                                               图 2.13 代码段的存取字节

 

   存取权字节的第0A位是访问位,用于请求分段不分页的系统中,每当该段被访问时,将A1。对于分页系统,则A被忽略未用。

抱歉!评论已关闭.