现在的位置: 首页 > 技术文章 > 操作系统 > 正文

段描述符高速缓冲寄存器介绍

2014年02月27日 操作系统 ⁄ 共 3340字 ⁄ 字号 段描述符高速缓冲寄存器介绍已关闭评论 ⁄ 阅读 2,199 次

实际上,不管是在实模式还是在保护模式下,CPU都会把一个分段的基地址放在一组隐藏的寄存器中,这组隐藏的寄存器,对程序员是不可见的,程序也是无法直接存取的,但却是实际存在的,这组隐藏的寄存器叫做描述符高速缓存寄存器(Descriptor Cache Registers),当段寄存器的值发生变化时,段的基地址、段的边界以及存取属性(存取权限)都会被重新加载到这个段寄存器对应的高速缓存中,为增强性能,CPU对随后的寻址均会直接从这个高速缓存中计算,而不会去描述符表中提取描述符.

前面我们提到过,CPU内部寄存器GDTR中存储着描述符表的起始地址,细心的读者可能会发现,《80386寄存器组成》一文中提到的GDTR寄存器有48bits,而且分成两部分,一部分是32bits,另一部分是16bits,这是怎么回事呢?实际上GDTR中不仅存着描述符表的起始地址,还存放着描述符表的长度,其中16bits的部分就是描述符表的长度,32bits的部分就是描述符表的起始地址,按照规范,描述符表中最多可以有8192(8K)个描述符,每个长度8个字节,所以最大长度为64K,16bits已经足够了,同理,段寄存器仍然保持16bits长度也是足够的。

不管是在实模式还是在保护模式下,CPU在实际寻址时都会使用这个高速缓存。所不同的是,在实模式下,在段寄存器的值发生变化时,仅仅把段寄存器的值×16(左移4位)放到高速缓存的的基地址位置,段界限和存取权限总是一个固定不变的值(按照Intel的说法,PC机加电后工作在实模式,高速缓存中将被置入缺省值,在实模式下,其中的段界限和存取权限将一直保持不变);而在保护模式下,当段寄存器发生变化时,CPU要从描述符表中加载数据到高速缓存中,实际上,保护模式下CPU在从描述符表中向高速缓存中加载数据时要做大量的保护性检查,大致如下:

  1. 段寄存器的值不能是0。根据规范,描述符表中的第一个描述符必须是空描述符,所以段寄存器值为0是不合法的。如果为0,产生异常中断13.
  2. 段寄存器中的值是否大于或等于描述符表的长度(存在GDTR中),如果大于或等于描述符表的长度,产生异常中断13.
  3. 如果段寄存器是CS,检查描述符表中的段类型是否为代码段,如果不是,产生异常中断13.
  4. 如果段寄存器CS要求装入的段是代码段,检查描述符表该段是否存在,如果不存在产生异常中断11
  5. 如果段寄存器CS通过了3、4的检查,还要检查IP是否超越了该段的边界,如果越界,产生异常中断13
  6. 如果段寄存器CS通过了3、4、5的检查,则把相应的描述符装入高速缓存
  7. 如果段寄存器不是CS,检查描述符表中的段类型为数据段,如果不是产生异常中断13
  8. 如果段寄存器不是CS,该段为数据段,检查其是否存在,如果不存在产生异常中断13
  9. 如果段寄存器不是CS,且通过了7、8检查,则把相应的描述符装入高速缓存

以上过程,不一定很完整,大概就是这样,从中大家应该可以看出所谓保护模式的保护方式,至少有一个感性认识。

×