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

马智  等:面向 SPARC 处理器架构的操作系统异常管理验证                                                  1639


         到对应的内存堆栈之中,保存完毕后,将 WIM 的数值右移一位,窗口寄存器的内容已经被保存,此时就可以对当
         前窗口寄存器进行数值改变等操作:
                                                   −=
                                    def true,  if  ( SCWP ) 1 S (WIM  )
                                      ⎧
                             win  _Ovf  = ⎨
                                                   −≠
                                      ⎩ false, if  ( SCWP ) 1 S (WIM )
                                           def
                                                             ( ,(0~ 28,32~ 60)),
                             save _WF ( , , ) =L S H  L l  l i  i  H sp
                                              ( 0 ~ 7, 0 ~ 7) x
                                             e lt  ( SWIM x  )  4 l in  l 4 1x  −  ( SWIM )
             如果没有发生窗口上溢,直接开始保存上下文环境,上下文内容即当前寄存器窗口的内容,需要保存的寄存
         器有 l0~l2,i0~i7 和全局寄存器 g1~g7.这是因为进入当前寄存器窗口之后,l3~l7,o0~o7 都还未使用过,g0 的值恒
         为 0,所以不需要保存,将保存上下文函数定义为 save_Reg,此时用于保存异常上下文的堆栈使用的是发生异常
         的任务的堆栈空间.为了保障系统的实时性,异常管理需要考虑异常嵌套的情况,使用全局变量 nest 来表示嵌套
         层数,初始值为 0,系统每响应一次异常,nest 数值加一:
                            def
             save _ Reg ( , , ) =G L H   (sp  = let  fp  +  128)   [ { 0 ~ 2, 0 ~ 7}, { 1 ~ 7}]L lin  l i  i  G g  g  x  H { ,(0 ~ 8,32 ~ 60,64 ~ 88)}sp

                         def
             plus  _ Nest (M  ) =  M (nest x  )  5 l in  l 5 1+ let  x  M (nest )
             公式(3)和公式(4)为异常管理从初始状态到保护环境上下文状态的迁移过程,对应的迁移过程如图 7 所示:
                                                       ′
                                            ′
                    win _Ovf =  true win TR L →  _  ( )  L save _WF L S H →  ( , , )  ( , ,H′  L S′  ′  ) win TL ′  _  ()L →  ′  L′′′
                                                 G
                                                             _
                              save  _ Reg G L H′ →  ( , ′′′ ,  )  ( ,L′′′′ ,H′′ ) plus Nest (M →  )  M ′  (3)
                                                     S′
                                   (, , , S M H ⇒
                                                          , ′
                                exce G L   , )  ( ,L′′′′ , ,M H′′ ) exce disable
                                                                 _
                                                 G
                                         _
                         win  _Ovf =  false save Reg ( , ,G L H →  )  ( , ,G L H′  ′  ) plus Nest (M →  )  M ′
                                                                  _
                                                                                              (4)
                                                    ′
                                           ,
                                                               _
                                  exce (, ,G L M H ⇒  ( , ,G L M H′ , ′  )  exce disable
                                             )
                              转入异常         窗口上溢?     N
                               管理                       保护上下文          nest加1
                                             Y
                                           保存上溢
                                           窗口内容

                             Fig.7    State transition diagram in the context protection phase
                                      图 7   上下文保护阶段的状态迁移图
             公式(3)中,系统若发生窗口上溢,将寄存器窗口向右移动一位,保存此窗口的寄存器内容到相应的堆栈之
         中,调整 WIM 寄存器的指向.处理完毕后,将寄存器窗口向左移动归位,开始保存当前窗口寄存器中的上下文环
         境,将寄存器中的内容保存到任务堆栈中.随后,异常嵌套加 1.值得注意的是:此时 ET 位信息并没有发生改变,系
         统仍然处于异常屏蔽状态.公式(4)中,系统没有发生窗口上溢,跳过窗口上溢处理步骤,直接开始保存当前窗口
         寄存器的上下文环境,嵌套层数 nest 加 1.
             3) ESR 跳转
             上下文保存工作完成之后,下一步便是引导控制流跳转入正确的 ESR 中.此时需要为任务切换做一些准备
         工作,这样做是因为 ESR 中可以执行任务启动、任务停止等操作来进行任务切换.SpaceOS 通过改变当前任务
         控制块指针(CurTcb)来切换任务,此时,CurTcb 指向被异常打断的任务.若发生任务切换,CurTcb 就会指向另外的
         任务,所以异常管理中还需要对控制块指针进行备份为任务切换做准备,将 CurTcb 中的内容存入 PreTcb 之中.
             为了保护上下文的数据安全,进入异常管理后,系统会一直处于异常屏蔽状态,上下文保存完毕之后需要打
         开异常响应,调整 ET 位的数值,并且需要考虑异常嵌套的情况,即:在 ESR 运行过程中,只有高优先级的异常才可
         以打断低优先级的异常,异常管理通过设置 PIL 的值来反映这种状态.set_Exce 函数表示根据 tbr 寄存器中存储
         的异常基本信息调整系统状态,当异常类型为陷阱时,则屏蔽所有中断响应,此时 ESR 中只能对陷阱类型的异常
   60   61   62   63   64   65   66   67   68   69   70