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 中是否发生任务切换:若不发生,直接进行上下文恢复操作;若发生任务切换,需要保存原
任务使用过的所有寄存器窗口,否则任务一旦切换这些内容都会丢失.要注意的是,此时上下文恢复的