Page 62 - 《软件学报》2021年第6期
P. 62
1636 Journal of Software 软件学报 Vol.32, No.6, June 2021
路将一个固定的地址写入指令寄存器中,CPU 从该地址处读取并执行指令.在指令的执行过程中,CPU 硬件逻辑
根据所取到的指令完成状态的改变,这种改变由两部分组成:(1) CPU 自身状态的改变,包括指令寄存器、通用寄
存器、状态寄存器以及控制寄存等的改变;(2) 内存内容的改变,包括全局变量、任务堆栈等.指令寄存器的更新
也就是通常所说的“指令地址加 1”或“转移地址生成”,系统运行的推动力正是由这种自动更新所形成的.在这种
力的推动下,CPU 按顺序在指令序列上移动,我们称之为“执行流”.在执行流的流动过程中,CPU 不断地改变自
身和外部的状态,这就是我们通常所说的“程序的运行”.因此,计算机的运行的状态可以使用一个两元组来表示,
即〈寄存器状态,内存状态〉.为了对异常管理进行细粒度的建模,我们将两元组扩展为五元组:〈G,L,S,M,H〉,其
中,G,L,S 表示不同类型的寄存器状态,M,H 表示不同类型的内存成员,在第 3.1 节中对其进行详细解释.
3.1 基本数据类型定义
寄存器的种类与使用方法与硬件平台密切相关,本文重点关注采用 SPARC 体系的操作系统,将严格按照
SPARC 标准对寄存器模型进行数学建模.SPARC 处理器中包含 32 个通用寄存器,其中有 8 个寄存器是全局寄
存器,另外 24 个寄存器是窗口寄存器.这 24 个窗口寄存器可以被分为 3 组:out,in,local,SPARC 处理器中含有 8
个窗口,执行时将按照 0 到 7 的顺序依次切换窗口.在任务运行时,窗口寄存器中保存着当前任务的上下文信息.
在任意时刻,任务只使用一组窗口寄存器.当发生系统异常时,处理器会在不同的寄存器窗口之间移动,以保存
当前上下文环境.对全局寄存器和窗口寄存器的形式化定义如下所示:
(GlobReg ) ::G = g 0 | 1|...| 7g g
(WindReg ) W :: 0|...| 7 | 0|...| 7 | 0|...| 7l= l i i o o
(SpecReg ) :: |S = psr wim | | |tbr pc npc
(PsrReg ) psr :: |PIL CWP= | ET
(TbrReg ) tbr :: TBA tta= | | ttb
(CWinReg ) L W∈ → ( S CWP )
其中,
• G 表示全局寄存器(GlobReg);
• W 表示窗口寄存器(WindReg);
• S 用来表示 SPARC 的特殊寄存器(SpecReg);
• psr 表示程序状态寄存器(PsrReg),PsrReg(processor state register)是一个 32 位的寄存器,它包含了 11 个
字段,这些字段保存着处理器的状态信息.与异常管理密切相关的主要有 3 个字段:
¾ PSR_enable_traps(ET)字段,表示处理器此时是否可以响应异常:当 ET 为 0 时,处理器处于异常屏
蔽状态;ET 为 1 时,处理器处于异常响应状态;
¾ PSR_proc_interrupt_level(PIL)表示处理器目前可以接受异常的最低优先级;
¾ PSR_current_window_pointer(CWP)字段可以理解为指向当前寄存器窗口的指针,表示系统目前
正在使用的寄存器窗口是哪一个;
• wim 为窗口无效屏蔽寄存器,表示窗口寄存器的使用状态,通常用来判断窗口溢出或下溢;
• tbr 为异常基址标志寄存器(TbrReg),用来表示异常的基本属性,其中,TBA 表示异常的标志号,tta 表示异
常的种类(同步或异步),ttb 表示异常的优先级;
• pc 和 npc 表示程序计数器:pc 保存着系统正在执行的指令的地址,npc 保存着将要被执行的下一条指令
的地址.
为了描述窗口寄存器中的旋转动作,我们使用 L 来表示当前窗口寄存器,CWP 指向的寄存器窗口即为系统
当前使用的 WindReg,当 CWP 的值发生改变时,便伴随着窗口的旋转.图 5 中展示了窗口寄存器的这些特征,存
在 8 个寄存器窗口,分别是 0 到 7(用 w0~w7 标记),每个窗口对应了 24 个寄存器,其中 16 个与相邻的窗口共用.
这些寄存器窗口是交迭的,以循环圈的方式连接起来.SPARC 执行 RESTORE 和 SAVE 指令时,将导致窗口切
换,CWP 指针用来指向当前正在使用的窗口.特权模式下的 RETT 指令(return from trap)和异常事件(TRAP 指令)