描述表的概念(详细)

2010-05-05 14:49

描述符

*1.存储段描述符

 

80x86存储段描述符(共8字 节)

                          (图1)

属性字段(第5,6字 节)

 

 

我们先来看看这8个字节中我感觉最复杂的TYPE这 四位标志吧,然后在看看其他的位

第五字节低四位为描述符的类型描述,下面主要将这四位单独抽出进行说明:

__________________________________

|      |       |     |     |

| 3   | 2    | 1 | 0 |

| E   |       |     | A |

_________________________________

 

(1)位0指示描述符是否被访问过(Accessed), 用符号A标记。A=0表示尚未被访问,A=1 表示段已被访问。当把描述符的相应选择子装入到段寄存器时,80386把 该位置为1,表明描述符已被访问。操作系统可测试访问位,已确定描述符是否被访问过

(2)位3指示所描述的段是代码段还是数据段,用符 号E标记。E=0表示段为数据段,相应的描 述符也就是数据段(包括堆栈段)描述符。数 据段是不可执行的,但总是可读的。 E=1表示段是可执行段,即代码段,相应的描述符就是代码段描 述符。代码段总是不可写的,若需要对代码段进行写入操作,则必须使用别名技术,即用一个可写的数据段描述符来描述该代码段,然后对此数据段进行写入。

 

___________________________________

|      |       |     |     |

| 3   | 2    | 1 | 0 |

| E=0 | ED   | W |  A |

_________________________________

(3)在数据段描述符中(E=0的情况, ,如上图所示),TYPE中 的位1指示所描述的数据段是否可写,用W标 记。 W=0表示对应的数据段不可写。反之,W=1表 示数据段是可写的。注意,数据段总是可读的。

TYPE中的位2是ED位, 指示所描述的数据段的扩展方向。ED=0表示数据段向高端扩展,也即段内偏移必须小于等于段界限。ED=1表 示数据段向低扩展,段内偏移必须大于段界限。

___________________________________

|      |       |     |     |

| 3   | 2    | 1 | 0 |

| E=1 | C    | R | A |

_________________________________

(4)在代码段描述符中(E=1的情况,如上图所示),TYPE中 的位1指示所描述的代码段是否可读,用符号R标 记。R=0表示对应的代码段不可读,只能执行。R=1表 示对应的代码段可读可执行。注意代码段总是不可写的,若需要对代码段进行写入操作,则必须使用别名技术。

在代码段中,TYPE中的位2指 示所描述的代码段是否是一致代码段,用C标记。C=0表 示对应的代码段是非一致代码段(普通代码段),C=1表 示对应的代码段是一致代码段。

 

小结:(如下图)

                                     (图2)

 

上面这些我在初学保护模式的时候感觉很迷惑,所以先拿出来说说,下面再看看其他的标志位.

 

一.段基址与段界限

从图一我们可以看出基地址长32位,被安排在2,3,4,7字 节中,段界限长20位,被安排在0,1字 节与第6字节的低4位中。

使用两个域存放段基地址和段界限的原因与80286有关。在80286保 护方式下,段基地址只有24位长,而段界限只有16位 长。80286存储段描述符尽管也是8字节 长,但实际只使用低 6字节,高2字节必须 置为0。80386存储段描述符这样的安 排,可使得80286的存储段描述符的格式在80386下 继续有效。

 

二.

(1)P位称为存在(Present)位。P=1表 示描述符对地址转换是有效的,或者说该描述符所描述的段存在,即在内存中;P=0表示描述符对地址 转换无效,即该段不存在。使用该描述符进行内存访问时会引起异常。

 

(2)DPL表示描述符特权级(Descriptor Privilege level),共2位。它规定了所描述段的特权级,用于特权检查,以决 定对该段能否访问

 

(3)DT位说明描述符的类型。对于存储段描述符而言,DT=1, 以区别与系统段描述符和门描述符(DT=0)。

 

(4)TYPE标志,即开篇讲得那堆。

 

(5)G为就是段界限粒度(Granularity)位。G=0表 示界限粒度为字节;G=1表示界限粒度为4K 字 节。注意,界限粒度只对段界限有效,对段基地址无效,段基地址总是以字节为单位。

 

补充:段界限规定段的大 小。在80386保护模式下,段界限用20位表示,而且段界限可以是以字节为单位或以4K字 节为单位。段属性中有一位对此进行定义,把该位成为粒度位,用符号G标记。G=0表示段界限以字节 位位单位,于是20位的界限可表示的范围是1字节至1M字节,增量为1字 节;G=1表示段界限以4K字节为单位,于是20位的界限可表示的范围 是4K字节至4G字节,增量为4K字节。当段界限以4K字 节为单位时,实际的段界限LIMIT可通过下面的公式从20 位段界限Limit计 算出来:

LIMIT=limit*4K+0FFFH=(Limit SHL 12)+0FFFH

所以当粒度为1时,段的界限实际上就扩展成32位。 由此可见,在80386保护模式下,段的长度可大大超过64K字节。

 

 

 (6)D位是一个很特殊的位,在描述可执行段、向下扩展数据段或由SS寄 存器寻址的段(通常是堆栈段)的三种描述符 中的意义各不相同。

在描述可执行段的描述符中,D位决定了指令使用的地址及操作数所默认的大小。D=1表 示默认情况下指令使用32位地址及32位或8位 操作数,这样的代码段也称为32位代码段;D=0 表 示默认情况下,使用16位地址及16位或8位 操作数,这样的代码段也称为16位代码段,它与80286兼 容。可以使用地址大小前缀和操作数大小前缀分别改变默认的地址或操作数的大小。

在向下扩展数据段的描述符中,D位决定段的上部边界。D=1表 示段的上部界限为4G;D=0表示段的上部 界限为64K,这是为了与80286兼容。

在描述由SS寄存器寻址的段描述符中,D位 决定隐式的堆栈访问指令(如PUSH和POP指 令)使用何种堆栈指针寄存器。D=1表示使 用32位堆栈指针寄存器ESP;D=0表 示使用16位堆栈指针寄存器SP,这与80286兼 容。

 

(7)AVL位是软件可利用位。80386对该位的 使用未左规定,Intel公司也保证今后开发生产的处理器只要与80386兼 容,就不会对该位的使用做任何定义或规定。

 

 

 

三:.存储段描述符的结构类型表示

 

; 宏 (注:采用nasm语 法)

; 描述符

; usage: Descriptor Base, Limit, Attr

;        Base: dd

;        Limit: dd (low 20 bits available)

;        Attr: dw (lower 4 bits of higher byte are always 0)

%macro Descriptor 3

       dw   %2 & 0FFFFh                            ; 段界限 1                         (2 字节)

       dw   %1 & 0FFFFh                            ; 段基址 1                         (2 字节)

       db    (%1 >> 16) & 0FFh                    ; 段基址 2                         (1 字节)

       dw   ((%2 >> 8) & 0F00h) | (%3 & 0F0FFh)      ; 属性 1 + 段界限 2 + 属性 2         (2 字节)

       db    (%1 >> 24) & 0FFh                    ; 段基址 3                         (1 字节)

%endmacro ; 共 8 字节

 

 

*2.系统段描述符

在上面我们讲过对于存储段描述符其DT位为1, 当描述符的DT位为0时,那么这个描述符所 描述的就是一个系统段描述符了。

 

系统段是为了实现存储管理机制所使用的一种特别的段。在80386中,有两种系 统段:任务状态段TSS和局部描述符表LDT段。 用于描述系统段的描述符称为系统段描述符。

 

系统段描述符与存储段描述符几乎一模一样,但也有一定的差别:

(1)   DT位,DT=1表 示存储段,DT=0表示系统段。

(2)   D位,D位 在系统段中不使用。

(3)   与存储段最不相同的是TYPE段。系 统段描述符的类型字段TYPE仍是4位,其其含义与存储段描述符的类型却完全不同。只有类型编码为2、1、3、9和B的 描述符才是真正的系统段描述符,它们用于描述系统段LDT和任务状态段TSS,其它类型的描述符是 门描述符。具体见下表:

                        图3

 

**LDT段描述符

LDT段描述符描述任务的局部描述符表段。LDT段 描述符必须安排在全局描述符表中才有效。在装载LDTR寄存器时,描述符中的LDT段 基地址和段界限等信息被装入LDT段描述符高速缓冲寄存器中。

 

**.任务状态段描述符

任务状态段TSS用于保存任务的各种状态信息。任务状态段描述符描述某个任务状 态段TSS描述符分为286TSS和386TSS两 类。TSS描述符规定了任务状态段的基地址和任务状态段的大小等信息。在装载任务状态段寄存器TR时, 描述符中的段基地址和段界限等信息被装入到TR的高速缓冲寄存器中。在任务切换或执行LTR指 令时,要装载TR寄存器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值