空描述符
如果一个任务没有LDT,就会把LDTR清空,此时指向GDT中的第0项描述符,即为空描述符。
基本信息
- 中文名
空描述符
- 外文名
empty descriptor
- 本质
描述符
- 类型
计算机科学
- 学科
跨学科
- 作用
标志
介绍
描述符是与 “被描述物” 相关联的一组数据或数据结构, 多是用来记录被描述物的 “属性”的。
1、比如,段描述符, 来说明这个段的位置 (基地址),以及段长度(段界限),段的类型,段的权限(DPL)。
2、再比如,管理内存中的物理页框,对于每个页框, 内核会定义一个 “页框描述符” 的结构 来 标明 这个物理 页的 一些属性,比如,页是否被用于 文件的cache ,或是否用于作buffer ,页面属于内存的哪个区(DMA,NORMAL)……等等。
3、再通俗一点,比如你在 面向对象编程中 定义一个(没有定义方法)类:class person , 在这个类里面,有name,age, heigth, weight,等等属性, 这个类就可以看作一个对 person 的描述符,而具体的实例则是具体的“被描述物”。
每个程序都有自己的LDT,但是同一台计算机上的所有程序共享一个GDT。LDT描述局部于每个程序的段,包括其代码、数据、堆栈等。GDT描述系统段,包括操作系统本身。1个段描述表记录记录一个段的特征信息,中断描述符表记录中断的端口和其对应的函数入口地址或门的入口函数地址。全局描述表GDT记录所有表的地址.其中的项称之为描述符。就是这里记录CPL、DPL的信息。
用于当一个任务使用的所有段都是系统全局段时。
GDTR(48位)用于描述GDT的基址和界限。
LDTR(16位)用于描述当前任务的LDT在GDT中的选择子。
如果一个任务没有LDT,就会把LDTR清空,此时指向GDT中的第0项描述符,即为空描述符。
作用
GDT和IDT是整个系统一张,而LDT可以每个任务独占一长,用于存储每个任务私有的段的信息,所以当任务发生切换时,LDT也要随之切换,CPU中专门用一个16位的寄存器DTR来存储当前任务的LDT在GDT中的描述符的选择子,以此来定位当前任务的LDT。同时也存在这么一种情况,那就是一个任务使用的所有段都是系统全局的,它不需要用LDT来存储私有段信息,因此,当系统切换到这种任务时,会将LDTR寄存器赋值成一个空(全局描述符)选择子,选择子的描述符索引值为0,TI指示位为0,RPL可以为任意值,用这种方式表明当前任务没有LDT。这里的空选择子因为TI为0,所以它实际上指向了GDT的第0项描述符,第0项的作用类似于C语言中NULL的用法,它虽然是一个描述符,但却只起到到了标志的作用,规定GDT的第0项描述符为空描述符,其8个字节全为0,就是这个原因。如果把前面的空描述符选择子的TI位改为1,使之指向LDT中的0号描述符,这样的选择子就不是空选择子,它指向的LDT中的0号描述符是可以正常使用的,也就是LDT中没有空描述符。