一个任务会涉及多个段,每个任务需要一个描述符来描述,为了便于组织管理,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也随之切换。
全局描述符表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 

本文来自: 中国自学编程网(www.zxbc.cn) 详细出处参考:http://www.zxbc.cn/html/20070523/20289.html

posted on 2012-04-10 17:07  becomeBetter  阅读(595)  评论(0)    收藏  举报