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

为什么全局描述符表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。(这里需要事先定义好 TSS段)

同时也存在这么一种情况,那就是一个任务使用的所有段都是系统全局的,它不需要用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中没有空描述符一说。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值