WEB开发网
开发学院软件开发汇编语言 汇编教程:分段管理机制 阅读

汇编教程:分段管理机制

 2009-02-16 09:36:48 来源:WEB开发网   
核心提示:(7)AVL位是软件可利用位,80386对该位的使用未左规定,汇编教程:分段管理机制(2),Intel公司也保证今后开发生产的处理器只要与80386兼容,就不会对该位的使用做任何定义或规定,也要更新对应的段描述符高速缓冲寄存器的内容,即使段选择子未作改变,此外,描述符内第6字节中的位5必须置为0

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

此外,描述符内第6字节中的位5必须置为0,可以理解成是为以后的处理器保留的。

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

根据存储段描述符的结构,可定义如下的汇编语言描述符结构类型:

DESC STRUC

LIMITL DW 0 ;段界限低16位

BASEL DW 0 ;基地址低16位

BASEM DB 0 ;基地址中间8位

ATTRIB DB 0 ;段属性

LIMITH DB 0 ;段界限的高4位(包括段属性的高4位)

BASEH DB 0 ;基地址的高8位

DESC ENDS

利用结构类型DESC能方便地在程序中说明存储段描述符。例如:下面的描述符DATAS描述一个可读写的有效(存在的)数据段,基地址是100000H,以字节为单位的界限是0FFFFH,描述符特权级DPL=3。

DATAS DESC < 0FFFFH ,, 10H , 0F2H ,,>

再如:下述描述符CODEA描述一个只可执行的有效的32位代码段,基地址是12345678H,以 4K字节位单位的段界限值是10H(以字节位单位的界限是10FFFH),描述符特权级DPL=0。

CODEA DESC < 10H , 5678H , 34H , 98H , 0C0H , 12H >

<三>全局和局部描述符表

一个任务会涉及多个段,每个任务需要一个描述符来描述,为了便于组织管理,80386把描述符组织成线性表。由描述符组成的线性表称为描述符表。在80386中有三种类型的描述符表:全局描述符表GDT(Global Descriptor Table)、局部描述符表LDT(Local Descriptor Table)和中断描述符表IDT(Interrupt Descriptor Table)。在整个系统中,全局描述符表GDT和中断描述符表IDT只有一张,局部描述符表可以有若干张,每个任务可以有一张。

例如,下列描述符表有6个描述符构成:

DESCTAB LABEL BYTE

DESC1 DESC <1234H,5678H,34H,92H,,>

DESC1 DESC <1234H,5678H,34H,93H,,>

DESC1 DESC <5678H,1234H,56H,98H,,>

DESC1 DESC <5678H,1234H,56H,99H,,>

DESC1 DESC <0FFFFH,,10H,16H,,>

DESC1 DESC <0FFFFH,,10H,90H,,>

每个描述符表本身形成一个特殊的数据段。这样的特殊数据段最多可包含有8K(8192)个描述符.

关于中断描述符表IDT在以后的文章中介绍。

每个任务的局部描述符表LDT含有该任务自己的代码段、数据段和堆栈段的描述符,也包含该任务所使用的一些门描述符,如任务门和调用门描述符等。随着任务的切换,系统当前的局部描述符表LDT也随之切换。(本文来自编程入门网:www.bianceng.cn)

全局描述符表GDT含有每一个任务都可能或可以访问的段的描述符,通常包含描述操作系统所使用的代码段、数据段和堆栈段的描述符,也包含多种特殊数据段描述符,如各个用于描述任务LDT的特殊数据段等。在任务切换时,并不切换GDT。

通过LDT可以使各个任务私有的各个段与其它任务相隔离,从而达到受保护的目的。通过GDT可以使各任务都需要使用的段能够被共享。下图给出了任务A和任务B所涉及的有关段既隔离受保护,又合用共享的情况。通过任务A的局部描述符表LDTA和任务B的局部描述符表LDTB,把任务A所私有的代码段CodeA及数据段DataA与任务B所私有的代码段CodeB和数据段DataB及DataB2隔离,但任务A和任务B通过全局描述符表GDT共享代码段CodeK及CodeOS和数据段DataK及DataOS。
  一个任务可使用的整个虚拟地址空间分为相等的两半,一半空间的描述符在全局描述符表中,另一半空间的描述符在局部描述符表中。由于全局和局部描述符表都可以包含多达8192个描述符,而每个描述符所描述的段的最大值可达4G字节,因此最大的虚拟地址空间可为:

4GB*8192*2=64MMB=64TB

<四>段选择子

在实模式下,逻辑地址空间中存储单元的地址由段值和段内偏移两部分组成。在保护方式下,虚拟地址空间(相当于逻辑地址空间)中存储单元的地址由段选择子和段内偏移两部分组成。与实模式相比,段选择子代替了段值。

段选择子长16位,其格式如下表所示。从表中可见,段选择子的高13位是描述符索引(Index)。所谓描述符索引是指描述符在描述符表中的序号。段选择子的第2位是引用描述符表指示位,标记为TI(Table Indicator),TI=0指示从全局描述符表GDT中读取描述符;TI=1指示从局部描述符表LDT中读取描述符。

选择子

结 构

BIT15 BIT14 BIT13 BIT12 BIT11 BIT10 BIT9 BIT8 BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0
描述符索引 TI RPL

选择子确定描述符,描述符确定段基地址,段基地址与偏移之和就是线性地址。所以,虚拟地址空间中的由选择子和偏移两部分构成的二维虚拟地址,就是这样确定了线性地址空间中的一维线性地址。

选择子的最低两位是请求特权级RPL(Requested Privilege Level),用于特权检查。 RPL字段的用法如下:

每当程序试图访问一个段时,要把当前特权级与所访问段的特权级进行比较,以确定是否允许程序对该段的访问。使用选择子的RPL字段,将改变特权级的测试规则。在这种情况下,与所访问段的特权级比较的特权级不是CPL,而是CPU与RPL中更外层的特权级。 CPL存放在CS寄存器的RPL字段内,每当一个代码段选择子装入CS寄存器中时,处理器自动地把CPL存放到CS的RPL字段。

由于选择子中的描述符索引字段用13位表示,所以可区分8192个描述符。这也就是描述符表最多包含8192个描述符的原因。由于每个描述符长8字节,根据上表所示选择子的格式,屏蔽选择子低3位后所得的值就是选择子所指定的描述符在描述符表中的偏移,这可认为是安排选择子高13位作为描述符索引的原因。

有一个特殊的选择子称为空(Null)选择子,它的Index=0,TI=0,而RPL字段可以为任意值。空选择子有特定的用途,当用空选择子进行存储访问时会引起异常。空选择子是特别定义的,它不对应于全局描述符表GDT中的第0个描述符,因此处理器中的第0个描述符总不被处理器访问,一般把它置成全0。但当TI=1时,Index为0的选择子不是空选择子,它指定了当前任务局部描述符表LDT中的第0个描述符。

<五>段描述符高速缓冲寄存器

在实模式下,段寄存器含有段值,为访问存储器形成物理地址时,处理器引用相应的某个段寄存器并将其值乘以16,形成20位的段基地址。在保护模式下,段寄存器含有段选择子,如上所述,为了访问存储器形成线性地址时,处理器要使用选择子所指定的描述符中的基地址等信息。为了避免在每次存储器访问时,都要访问描述符表而获得对应的段描述符,从80286开始每个段寄存器都配有一个高速缓冲寄存器,称之为段描述符高速缓冲寄存器或描述符投影寄存器,对程序员而言它是不可见的。每当把一个选择子装入到某个段寄存器时,处理器自动从描述符表中取出相应的描述符,把描述符中的信息保存到对应的高速缓冲寄存器中。此后对该段访问时,处理器都使用对应高速缓冲寄存器中的描述符信息,而不用再从描述符表中取描述符。

各段描述符高速缓冲寄存器之内容如下表所示。其中,32位段基地址直接取自描述符, 32位的段界限取自描述符中20位的段界限,并根据描述符属性中的粒度位转换成以字节为单位。其它十个特性根据描述符中的属性而定,“Y”表示“是”,“N”表示“否” ,“R”表示必须可读,“W”表示必须可写,“P”表示必须存在,“D”表示根据描述符中属性而定。

段描

述符

高速

缓冲

寄存

器的

内容

段寄存器 段基地址 段界限 段属性
存在性 特权级 已存取 粒度 扩展方向 可读性 可写性 可执行 堆栈大小 一致特权
CS 32位基地址 32位段界限 P D D D D D N Y - D
SS 32位基地址 32位段界限 P D D D D R W N D -
DS 32位基地址 32位段界限 P D D D D D D N - -
ES 32位基地址 32位段界限 P D D D D D D N - -
FS 32位基地址 32位段界限 P D D D D D D N - -
GS 32位基地址 32位段界限 P D D D D D D N - -

段描述符高速缓冲寄存器再处理器内,所以可对其进行快速访问。绝大多数情况下,对存储器的访问是在对应选择子装入到段寄存器之后进行的,所以,使用段描述符高速缓冲寄存器可以得到很好的执行性能。

段描述符高速缓冲寄存器之内保存的描述符信息将一直保存到重新把选择子装载到段寄存器时再更新。程序员尽管不可见段描述符高速缓冲寄存器,但必须注意到它的存在和它的上述更新时机。例如,在改变了描述符表中的某个当前段的描述符后,也要更新对应的段描述符高速缓冲寄存器的内容,即使段选择子未作改变,这可通过重新装载段寄存器实现。

上一页  1 2 

Tags:汇编 教程 分段

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接