一、回顾
在前面的课程学习中我们了解到,段寄存器有96位,其中80位不可见,包括Base,limit,attribute。16位可见,即段选择子selector。
对段寄存器进行写入时,CPU根据段选择子到GDT表中寻找段描述符,段描述符共8字节,64位,CPU根据段描述符填充段寄存器。
那么问题就是,如何用64位的段描述符来填充80位的段寄存器呢?为了解决该问题,我们需要学习段描述符的P,G位。
段描述符结构
段寄存器结构

二、P位
这个位比较简单,当P=1时,段描述符有效;当P=0时,段描述符无效。
三、G位
由于Intel考虑向前兼容,我们会发现段描述符的结构比较混乱,东一块西一块的。Attribute在段描述符高4字节的8-23位,Base在段描述符的低4字节的16-31位,高4字节的0-7位和24-31位。上述两个属性没有数据丢失,段寄存器和段描述符内的位数是一样多的。而Limit在段寄存器内占32位,在段描述符内只有20位。
当G=0时,Limit的范围是0x00000000-0x000FFFFF,其中,段描述符的20位在低位,高位补0.
当G=1时,Limit的范围是0x00000FFF-0xFFFFFFFF,其中,段描述符的20位在高位,低位补F。
四、练习
给出下列5个段选择子,

本文详细介绍了段描述符中的P位和G位。P位为1时,段描述符有效,为0则无效。G位用于决定段限界Limit的有效范围,G=0时限制在0x00000000-0x000FFFFF,G=1时扩展至0x00000FFF-0xFFFFFFFF。并给出了5个段选择子的例子,演示了如何从GDT表中查找段描述符并填充到段寄存器中。
最低0.47元/天 解锁文章
8565

被折叠的 条评论
为什么被折叠?



