x86架构下的系统段描述符格式

        如果还记得前面的GDT全局描述符表的话,那么一定不会忘记段描述符中有个s字段,若为0,则表示这个描述符是系统段,若为1,则是普通的段描述符;普通的段为ds,es,ss,cs等等,系统的段则有GDT,调用门,TSS,LDT等等。现在来看看几个系统段描述符格式;

        ---------------------------------------------------------------------------------调用门-------------------------------------------------------------------------------

        首先来看下调用门描述符格式(GDT在前面已经分析过了):

       

        依旧是上面为高32位,下面是低32位。因为调用门是用来给低特权级程序调用高特权级例程的桥梁,所以调用门描述符格式中只要提供该例程所在的段描述符,以及在该段内的偏移位置就可以了。

        所以低32位中16~31是高特权级例程所在的代码段选择子,也提供了32位的段内偏移量。

        P位依然是段存在位标识;

        DPL是表示调用门的特权级,和目标例程的特权级不一样。这里有个有趣的问题:调用者的特权级要高于调用门的特权级同时还必须低于目标例程的特权级。CPL数值 <= 调用门描述符的DPL;RPL数值 <= 调用门描述符的DPL; CPL数值 >= 目标例程的DPL;

        TYPE是表示门类型,1100表示调用门,其实有调用门,陷阱门,中断门等门类型;

        参数个数:调用门调用时,会对堆栈进行切换。所以要定义要转移的参数个数,比如特权级2程序调用特权级0程序,当在特权级2程序中压入某个参数,调用到了特权级0程序中是弹出的就是那个参数。虽然在特权级2程序中压入的是特权级2的堆栈,而特权级0的程序中是特权级0的堆栈,但弹出的数据是一样的,因为系统会自动切换相应特权级的堆栈,也会把堆栈中的数据复制到相应特权级堆栈中;

        ------------------------------------------------------------------------LDT描述符格式--------------------------------------------------------------------------------------

        前面一直说全局描述符表GDT,一直强调是全局,说明有其相对应的局部描述符,那就是LDT描述符0;LDT描述符格式看下图:

        x86架构下的系统段描述符格式_第1张图片

        LDT描述符格式和GDT描述符很相似,可以参考http://blog.csdn.net/yuzhihui_no1/article/details/42386915;下面来分析下不同的字段。

        段基地址和段界限和GDT中的一样,G依旧是粒度位;D 和 L位对LDT来说没意义,恒为0;S位为0,表示是系统段;TYPE为0010,表示是LDT段;其他字段都和GDT中的一样了。同样的系统中有个寄存器用来表示LDT的位置,那就是LDTR,同样有lldt加载LDT表到LDTR中,sldt把LDTR中内容加载到指定地方;唯一不一样的是GDT表是整个系统唯一的一张,而LDT是每个任务有一张;(但LDTR是全局唯一的)一般把LDT加载到GDT表中;

        ----------------------------------------------------------------------TSS描述符格式----------------------------------------------------------------------------------------

        TSSx86架构下的系统段描述符格式_第2张图片


转载地址:http://blog.csdn.net/yuzhihui_no1/article/details/42402795


你可能感兴趣的:(架构,X86)