7.6 任务链(Task Linking)

TSS的返回链(back-link)字段和标志字中的NT(nested task)位允许80386自动返回到一个先前调用任务或被中断的任务中去。当一条CALL指令,或中断指令,或内部中断,或一个异常引起了任务切换,到了一个新任务中。80386处理器自动使用当前任务的选择子来填充新作任务的返回链字段,同时设置新任务标志寄存器的NT位。NT位指示出返回字段是否有效。新的任务通过IRET指令放弃当前控制。当解析IRET指令时,386检查NT标志。如果NT位设置,80386切换到由返回字段指示的任务。表7-2总结这些字段的用处。

7.6.1 忙位防止了环(Busy Bit Prevents Loops)

TSS描述符的B-位(busy bit)保证了返回字段的完整性。返回链可能会很深,这种情况发生在一个中断任又被别的任务中断时,或一个被调用的任务又调用别的任务时。忙位可以让CPU检测到这样发生一个环的情况。环的形成是指试图进入一个已忙的任务。但是TSS是不可重入的。

处理器照以下方法使用忙位:

1、 当任务切换时,处理器自动设置新任务的忙位。

2、 当任务切换时,如果旧任务没有位于返回链上的话(也就是说引起任务切换的是一条JMP或IRET指令)处理器自动清除旧任务的忙位。如果任务位于返回链上,忙位被保留。

3、 当向一个任务切换时,如果处理器发现新任务的忙位设置,则引发一个异常。

通过这些操作,处理器防止了任务切换到自已或是到一个已在任务链上的任务,所以防止了非法的任务重入。

忙位对于多处理器环境也是有效的,因为处理器在清除或设置忙位时会自动锁定总线。这样的操作可以防止2个处理器同时唤醒同一个任务(关于多处理器,请参看第11章)。

7.6.2 修改任务链(Modifying Task Linkages)

所有对返回链和忙位的修改都应是由最受信任的代码来操作的。这样的修改可能会使一个被中断的任务比一个中断它的任务先恢复执行。受信任代码必须在以下两种方针下将一个任务从返回链中移去:

1、 首先修改中断任务的返回链字段,然后清楚被移除的任务的描述符的忙位。

2、 保证在修改返回链和忙位时,没有中断发生。