上述转移过程中的第六步,也就是“把描述符装入CS”,是指把上述指定处理程序段的描述符装入CS的高速缓冲寄存器中,在这一步骤中要对描述符进行类似通过调用门进行转移的其它检查,包括是否代码段描述符和代码段描述符是否存在等,因此可能再发生异常。在对该描述符进行检查时,通过调整门中选择子的RPL=0(在处理器内部调整,而不影响存储器中的选择子的RPL字段)的方法,实现只考虑代码段的DPL,而不考虑门中选择子的RPL。把描述符装入CS之后,还要检查门描述符中给出的表示处理程序代码段入口的偏移是否越界,即是否超出段界限。如果越界,就引起出错码为0的通用保护故障。
从转移过程还可以看出,把标志寄存器和断点压入堆栈的做法和顺序与实模式是相同的,但这里每一次堆栈操作是一个双字,CS被扩展成32位。在16位段中亦是如此。
把TF置成0,表示不允许处理程序单步执行。把NT置成0,表示处理程序在利用中断返回指令IRET返回时,返回到同一任务而不是一个嵌套任务。需要注意的是,任何特权级的程序都可改变NT位,这样可以利用中断或陷阱处理程序完成任务切换。
通过中断门的转移和通过陷阱门的转移之间的差别只是对IF标志的处理。对于中断门,在转移过程中把IF置为0,使得在处理程序执行期间屏蔽掉INTR中断(当然,在中断处理程序中可以人为设置IF标志打开中断,以使得在处理程序执行期间允许响应可屏蔽中断);对于陷阱门,在转移过程中保持IF位不变,即如果IF位原来是1,那么通过陷阱门转移到处理程序之后仍允许INTR中断。因此,中断门最适宜于处理中断,而陷阱门适宜于处理异常。
在有出错码的情况下,转入处理程序之前还要把出错码压入堆栈。只有异常处理才可能有出错码。下图给出了通过中断门或陷阱门转移时的堆栈情况。(a)是没有变换特权级和没有出错码的情形;(b)是没有变换特权级有出错码的情形;(c)是变换特权级和没有出错码的内层堆栈的情形。(d)是变换特权级和有出错码的内层堆栈情形。注意图中每一项为双字。
如果中断向量号所只是的门描述符是任务门描述符,那么控制转移到一个作为独立的任务方式出现的处理程序。任务门中的选择子是指向描述对应处理程序任务的TSS段的选择子,即该选择子指示一个可用的286TSS或386TSS。通过任务门的转移与通过任务门到一个可用的386TSS的段间调用指令CALL的转移很相似,主要的区别是,对于提供出错码的异常处理,在完成任务切换之后,把出错码压入新任务的堆栈中(通过任务门进行转移时,返回地址和外层栈指针不压入新任务的堆栈)。
通过任务门的转移,在进入中断或异常处理程序时,标志寄存器EFLAGS中的NT位被置为1,表示是嵌套任务,则IRET指令返回时,沿TSS中的链接字段返回到最后一个被挂起的任务。
在响应中断或处理异常时,使用任务门可提供一个处理程序任务的自动调度。这种任务调度由硬件直接执行,并且越过包含在操作系统中的软件任务切换,这就为处理程序提供了一个快速的任务切换。
5.转移方法的比较对中断的响应和异常的处理,80386允许通过使用中断门或陷阱门实现由当前任务之内的一个过程进行处理;也允许通过使用任务门实现由另一个任务进行处理。在当前任务之内的处理程序较为简单,并可以很快地转移到处理程序,但处理程序要负责保存及恢复处理器的寄存器等内容。转到不同任务的处理程序要花费较长时间,保存及恢复处理器寄存器内容的开销作为任务切换的一部分。使用当前任务内的处理程序的方法,在响应中断或