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 中只能对陷阱类型的异常