保护模式段选择子格式 #
段寄存器CS、DS、ES、SS、FS、GS 是由影子寄存器、段描述符索引、描述符表索引、权限级别组成的。如下图所示:
上图中影子寄存器是靠硬件来操作的,对系统程序员不可见,是硬件为了减少性能损耗而设计的一个段描述符的高速缓存,不然每次内存访问都要去内存中查表,那性能损失是巨大的,影子寄存器也正好是 64 位,里面存放了 8 字节段描述符数据。
通常情况下,CS 和 SS 中 RPL 就组成了 CPL(当前权限级别),所以常常是 RPL=CPL,进而 CPL 就表示发起访问者要以什么权限去访问目标段,当 CPL 大于目标段 DPL 时,则 CPU 禁止访问,只有 CPL 小于等于目标段 DPL 时才能访问。
当selector的值为0000H到0003H时,这个selector是Null selector,它指向 GDT的第0项,第0项的Descriptor是unused。Null selector的作用类似于C指针中的NULL值,用于防止代码对unused segment register进行访问。
13位的段描述符索引的取值范围是0-1FFFH(0-8191),表示selector可以寻址 8192个descriptor。