Page 66 - 《软件学报》2021年第6期
P. 66

1640                                     Journal of Software  软件学报 Vol.32, No.6,  June 2021

         进行响应;当异常类型为中断时,设置 pil 位为它的优先级 ttb,只有高优先级才可以打断低优先级.这些操作大多
         由计算机硬件自动完成,异常管理之中只需要设置相应的寄存器状态即可:
                                           def
                               store _Tcb (,L M ) = let  M  (CurTcb ) x  4 l in  4 l x  M  (PreTcb )
                                                 ←
                                           ⎧S (pil )  0,           if  tbr (tta ) =  trap
                               set  _ Exce  ( ) = ⎨
                                        S
                                      pil       )←
                                           ⎩  ( S pil  (ttb ),  if tbr (tta ) = tbr  inter
                                         ⎧
                                       def true,  if  (Mnest  = 1)
                               exce _ Nest  = ⎨
                                                 (
                                         ⎩ false, if Mnest  ≠ 1)
             我们将进入 ESR 之前的准备状态定义为公式(5)和公式(6),系统的状态迁移图如图 8 所示.
                                        exce _ disable exce Nest  =  true    ⎫
                                                      _
                                                                      ( ) ′ → S
                                 ( ,
                          store _Tcb L M ) →  ( , ′ L M  ) ′  set  _ Exce pil ( ) →  ′ S en  _ Exce S  ′′ S  ⎪ ⎬  (5)
                                           , ) ⇒ L M S
                                    exce (, L M S  ( , ′′  ′ , ′′ )  exce enable  ⎪ ⎭
                                                             _
                                                                ′
                        exce  _ disable exce Nest →  _  false set Exce  ( )S →  S en _ Exce ′  ( )S →  S′′
                                                    _
                                                         pil                                  (6)
                                         exce ()S ⇒  ( )  S′′  exce _ enable
                                             N    设置ESR       打开异常       获取ESR入口地址
                       nest加一        nest=1?
                                                   状态          响应          与返回地址
                                     Y
                                     备份tcb                                  转入ESR

                                     Fig.8    ESR jump stage migration diagram
                                          图 8  ESR 跳转阶段迁移图
             公式(5)中,如果异常嵌套层数为一(exce_Nest),备份当前任务控制块指针(store_Tcb),根据异常基本属性设
         置系统状态,最后打开异常响应;公式(6)表示若异常嵌套层数不为一,即此时系统中发生了多个异常并且正在处
         理的异常不是第 1 个发生的异常,这时候不需要对 Tcb 信息进行保存,仅仅根据异常的属性来调整系统对其他异
         常的响应条件即可.
             系统状态调整完毕后,异常管理会引导控制流跳转到 ESR 中,寻找 ESR 入口地址操作定义为 find_Exceaddr,
         Tbr 寄存器中的 TBA 保存着异常的标志号,ossm 表示异常标志表,保存了每个异常标志所对应的 ESR 入口地址,
         因此可以根据异常的标志信息在标志表中寻找对应的 ESR 地址,将此地址保存在 l6 中.ESR 处理完成后,控制流
         跳转回异常管理,需要一个返回地址,将跳转前 pc 指向的地址保存到 o7 之中,定义为函数 pass_PC.这一阶段的
         状态迁移定义为公式(7):
                                                                              ⎫
                                           def
                                                                           ( 6)⎪
                                                                    ( 3)) →
                         find  _ Exceaddr (, ,L S M ) =   ( 3) ← let  L l  ( S TBA in  (ossm l  L l
                                                           )   M
                                                                              ⎪
                                     def                                      ⎪
                                ( , ) =
                         pass _ PC L S  ( S pc ) →  L ( 7)o                   ⎬               (7)
                                              ′′
                                                            ′′
                                                          ( , ) →
                         findExceaddr ( , ,L S M  ) →  ( , ,L S M  ) passPC L S  ( , ′′ ′′ S  )  ⎪
                                                                  L
                                                                              ⎪
                               exce (,L M S   ( , ′′  , ′′ )  exce enable     ⎪
                                       , ) ⇒ esr L M S
                                                          _
                                                                              ⎭
             4)  上下文恢复
             ESR 执行完毕后,控制流跳转回异常管理,在进行上下文恢复前,需要考虑异常嵌套和任务切换的情况.
             •   首先判断异常是否嵌套,只有在异常非嵌套的情况下才会发生任务的切换;
             •   然后判断 ESR 中是否发生任务切换:若不发生,直接进行上下文恢复操作;若发生任务切换,需要保存原
                任务使用过的所有寄存器窗口,否则任务一旦切换这些内容都会丢失.要注意的是,此时上下文恢复的
   61   62   63   64   65   66   67   68   69   70   71