Page 68 - 《软件学报》2021年第6期
P. 68
1642 Journal of Software 软件学报 Vol.32, No.6, June 2021
关闭异常 Y Y 保护原任务使用
跳出ESR nest=1? 任务切换?
响应 过的所有窗口
N
N
恢复上下文 调整tcb与sp
Fig.9 State transition diagram of context recovery phase
图 9 上下文恢复阶段状态迁移图
跳出 ESR 后,控制流返回异常管理中.为了保护数据安全关闭异常响应,进行异常嵌套判断.
• 若嵌套层数不为 1,则直接恢复当前窗口上下文,此时恢复的上下文为被打断的 ESR 中的上下文,使用
公式(8)来表示这一过程;
• 若嵌套层数为 1,表明此时系统中所有的 ESR 都已经执行完毕,再次进行判断,是否发生任务切换:如果
不发生任务切换,则进行上下文恢复,此时恢复的上下文便是原任务的上下文,使用公式(9)来表示这一
过程;若在 ESR 之中发生了任务切换,需要执行 swtich_aWreg 操作,然后将新任务的上下文地址存入 sp
之中,最后恢复新任务的上下文到处理器中,这一过程使用公式(10)来表示.
对于 ESR 中不发生任务切换的情况来说,此时系统中的 CWP 与 WIM 与进入异常处理时的初始状态是一
样的,所以 sp 中的存储的始终是保存上下文的堆栈地址;而对于发生任务切换的情况,sp 的值是从任务控制块中
获取的,所以进行上下文恢复时恢复的是新任务的数据.
5) 异常退出
至此,异常管理的工作迎来尾声,控制流即将从异常管理跳出.退出之前需要检查异常退出时是否会发生窗
口下溢:如果会,则将发生下溢的寄存器窗口内容从堆栈之中恢复出来,并且改变 WIM 的值.判断异常退出时是
否会发生窗口下溢被定义为 win_Odf,将 CWP 的值加 1 与 WIM 相比较:如果相等,则说明会发生窗口下溢;如果
不等,则说明不会发生窗口下溢:
+=
def true, if ( SCWP ) 1 S (WIM )
⎧
win _Odf = ⎨ .
+≠
⎩ false, if (SCWP ) 1 S (WIM )
对窗口下溢的处理定义为 rest_WF,从对应的堆栈地址中恢复出原有的寄存器窗口数据,可以看作它是
save_WF 的逆函数.将异常嵌套层数减少定义为 redu_Nest,ESR 执行前嵌套层数加一来表示系统中目前有多个
异常在执行.同样,当系统中的 ESR 执行完毕之后,再需要将异常嵌套层数减一.异常返回时,程序状态也需要和
原来保持一致,save_psr 将 psr 寄存器中的内容存储到了 l0 之中,在异常退出前需要将其还原,被定义为 rest_psr:
⎧ let ( ) =winTL L ( ( S CWP ) 1, )+ W in
def let ( SWIM x ⎪ ⎪ ) o 4 in 4 1+ x o ( SWIM )
( , , ) = ⎨
rest _WF L S H
( 0 ~ 7, 0 ~ 7)
( ,(0 ~ 28,32 ~ 60)) x
⎪ Hsp L l l i i
⎪ ⎩ () =winTR L ( ( S CWP ) 1, )
−
W
def
redu _ Nest (M ) = M (nest x ) 5 o in o 5 1x + let M (nest )
def
rest _ psr ( , ) =L S ( L 0)l x ( S psr )
我们使用公式(11)、公式(12)来表示这一阶段的迁移过程,状态迁移图如图 10 所示.
′ ′
( , , ) → L S H
_
exce _ disable win Odf = true rest _WF L S H ( , , ) ⎫
( , ′
( , ) ′
′
′
( ) ′
_
_
L
redu _ Nest L M ) → (, ′ ′ ′′ ) rest psr L S → L M (, ′′ ′′ S ) en Exce S ′ → S ′′′ ⎪ ⎬ (11)
′′
,
(, , S M
exce L , ) ⇒H ( , ′′′′′ L S M H _ ⎪ ⎭
, ) en disable
exce _ disable win Odf = false ⎫
_
′
_
′L S
L
( ,
redu _ Nest L M ) → (, ′ ′ ) rest psr ( , ) → L M ′ (, ) en _ ( ) ′ S → S ′Exce S ′ ⎪ ⎬ (12)
( , ′′′
(, , S M
exce L ) ⇒ L S M ′ ) en disable ⎪ ⎭
_
,