为什么全局描述符表GDT的第0项总是一个空描述符

用于当一个任务使用的所有段都是系统全局段时。

GDTR48位)用于描述GDT的基址和界限

LDTR16位)用于描述当前任务的LDTGDT中的选择子。

如果一个任务没有LDT,就会把LDTR清空,此时指向GDT中的第0项描述符,即为空描述符。

转自:http://apps.hi.baidu.com/share/detail/24570154 

LESSON4:为什么全局描述符表GDT的第0项总是一个空描述符,而局部描述符表却不是这样

              

               386的保护模式下:

                              DT=GDT*1+IDT*1+LDT*n;

                              IDT和每个LDT都要到GDT中报一次到.有一个描述符项与一张表对应.

                              其实什么是描述表呢?

                              很简单.1个段描述表记录记录一个段的特征信息 中断描述符表记录中断的端口和其对应的函数入口地址或门的入口函数地址

                              全局描述表GDT记录所有表的地址.其中的项称之为描述符.就是这里记录CPL.DPL的信息

前面说到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中没有空描述符一说

你可能感兴趣的:(c,null,存储,语言,任务)