无效TSS异常必须使用任务门进行处理,以保证处理程序有一个有效得任务环境。其它得异常通常在任务环境之内进行处理。在任务内,异常被检测并且不必屏蔽中断,所以,所以使用陷阱门。由陷阱门指示的异常处理程序是一个由所有任务共享的过程,所以该处理程序最好置于全局地址空间之内。如果各个任务要求有不同的处理程序,那么全局异常处理程序可保存一个各处理程序的入口表,并为引起异常的任务调用相应的处理程序。
中断通常与正执行的任务没有关系,并可能从使用任务门提供的隔离中获得好处。要求较快响应的中断,通过中断门可以得到较好的处理。因为中断随时都可能发生,所以,通过中断门访问的中断处理程序,必须置于全局地址空间中,以便对所有的任务都有效。还需强调的是,80386程序绝不能调用一个低特权级的过程,当处理器调用一个中断或异常处理程序时,它实施相同的规则,所以,这样一个过程必须至少具有与在其任务上下文中被调用的、由任务所执行的最高特权级的过程相同的特权级。因此,在使用中断门时,中断处理程序通常必须被安排在特权级0,否则若正在特权级0执行时发生中断,则不能进入中断处理程序,而会引起通用保护故障(中断处理程序使用任务门时除外,因为任务切换可以从任何特权级切换到目标任务的任何特权级)。
6.中断或异常处理后的返回中断返回指令IRET用于从中断或异常处理程序的返回。该指令的执行根据任务嵌套标志NT位是否为1分为两种情形。
NT位为1,表示是嵌套任务的返回。当前TSS中的链接字段保存有前一任务的TSS的选择子,取出该选择子进行任务切换就完成了返回。这种情形在由通过任务门转入的中断或异常处理程序返回时出现,因为在由中断门或陷阱门转入处理程序时,NT位已被清0。
NT位为0,表示当前任务内的返回。这种情形在由通过中断门或陷阱门转入的中断或异常处理程序返回时出现。具体进行的操作包括:从堆栈顶弹出返回指针EIP及CS,然后弹出EFLAGS值。弹出的CS选择子的RPL字段,确定返回后的特权级。如果返回选择子的RPL与CPL相同,则不进行特权级改变。若RPL规定了一个外层特权级,则需要特权级改变,从内层堆栈中弹出外层堆栈的指针ESP及SS的值。这些做法与RET指令相似。例如,使用CS选择子的RPL,而不是由选择子标识的段的DPL,是为了返回到不在DPL给定特权级的一致代码段。若弹出的CS的选择子的RPL规定了一个内层特权级,则产生通用保护故障。需要注意的是,对于IRET指令,保存在当前堆栈中的返回地址中的选择子字段必须指向代码段描述符。而不能是系统段或门描述符。否则将引起通用保护故障。
对于提供出错代码的异常处理程序,必须先人为地从堆栈中弹出出错代码,然后再执行IRET指令,及出错代码不会自动被处理器弹出或取消。
中断返回指令IRET不仅能够用于由中断/异常引起的嵌套任务的返回,而且也适用于由段间调用指令CALL通过任务门引起的嵌套任务的返回,如前文所述,在执行通过任务门进行任务切换的段间调用指令CALL时,标志寄存器中的NT位被置为1,表示任务嵌套。而RET指令不能实现此功能。