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       ⎪ ⎭
                                                           _
                                                     ,
   63   64   65   66   67   68   69   70   71   72   73