1.CSA概述
CSA(Context Save Areas)上下文存储区域,每次函数调用、进入中断、进入Trap都会存CSA对象,便于退出时候恢复。每个CSA对象的大小为固定的64字节。最大可以支持分配为2^16=4M。
2.GPRs寄存器
- 32个通用寄存器(GPRs)
- 16个32位地址寄存器A[0] - A[15]。
- 16个32位数据寄存器D[0] - D[15]。
- 其中[0] - [7]为“lower registers”
-
- 其中[8] - [15]为“upper registers”
- 1个PC - 程序计数器。
- 1个PCXI - 先前上下文信息寄存器。
- 1个PSW - 程序状态字寄存器。
- PCXI、PSW和PC寄存器对于存储和恢复任务上下文至关重要。
- 其中4个通用寄存器
-
- D[15]用作隐式数据寄存器
- A[10]是栈指针(SP)寄存器
- A[11]是返回地址(RA)寄存器
- A[15]是隐式地址寄存器
3.CSA内容
3-1.上下文类型
任务是一个独立的控制线程。任务的状态由其上下文定义。当一个任务被中断时,处理器使用该任务的上下文来重新启用该任务的继续执行。
上下文类型包括:
- Upper context:由上层地址寄存器A[10] ~ A[15]和上层数据寄存器D[8] ~ D[15]组成。上层环境还包括PCXI和PSW。为了函数调用的目的,这些寄存器被指定为非易失性(它们的内容在调用期间被保留)。
- Lower context:由下地址寄存器A[2] ~ A[7]、下数据寄存器D[0] ~ D[7]、A[11]和PCXI组成。
- 上下文保存到内存时,占用16个字块的存储空间,称为上下文保存区(csa)。
- PCXI.UL == 1为Lower context;PCXI.UL == 0为Upper context。
PCXI寄存器:先前上下文信息寄存器
PCXI寄存器包含到前一个执行上下文的链接信息,支持中断和自动上下文切换。PCXI是任务状态信息的一部分。前一个上下文指针(PCX)保存前一个任务的CSA的地址。
3-2.任务切换操作
当遇到如表7这些事件或指令,将保存或恢复任务的upper or lower context。
-
- Upper context 会在外部中断、Trap或函数调用时自动保存。
- Lower context 通过指令显式保存。在表7中,“保存”是从链接字中读取FCX的下一个值后,通过Free CSA表头指针寄存器(FCX)进行存储。Store是通过指令的有效地址进行存储,不改变CSA列表或FCX寄存器。
在upper and lower contexts 中寄存器的处理有本质的区别
- lower context寄存器与全局寄存器类似,因为中断处理程序、Trap处理程序或被调用函数看到的值与中断、Trap或调用之前寄存器中的值相同。在中断、Trap处理程序或被调用函数中对这些寄存器所做的任何更改,在事件返回后仍然存在,因为它们不会自动恢复为return from Call (RET)或return from Exception (RFE)。
- lower context寄存器可以用来向被调用函数传递参数,并传递这些函数的返回值。中断和Trap处理程序必须在使用这些寄存器之前保存它们在这些寄存器中找到的原始值,并在退出之前恢复原始值。
- upper context寄存器不能保证是静态硬件寄存器。从概念上讲,函数调用或中断处理程序总是从它自己私有的upper context寄存器集开始执行。被中断函数或调用函数的upper context寄存器不继承。
只有A[10]、A[11]、PSW、PCXI和(在trap的情况下)D[15]寄存器以被调用函数、trap处理程序或中断处理程序中体系结构定义的值开始。如果一个函数、Trap处理程序或中断处理程序在写入值之前读取任何其他 upper context registers,那么它正在执行一个未定义的操作。
3-3.上下文保存区域和上下文列表
该体系结构使用了固定长度的上下文保存区域的链表。CSA是16 word的内存存储,与16 word的边界对齐。每个CSA只能保存一个one upper or one lower context。csa通过一个LinkWord连接在一起。
LinkWord包括两个字段,它们将给定的CSA链接到链表中的下一个CSA。字段是一个4位的段和一个16位的偏移量。段号和偏移量用于生成链接CSA的有效地址(Effective Address, EA)。参见图13。
指针偏移量每增加1,EA就会增加到比前一个位置高16 word的地址。csa的每个地址段的总可用范围为4MByte,即2^16 csa的存储空间。
4.CSA的保存和恢复
每个CSA对象通过Linkword地址来链接,Linkword的地址内容都是指向下一个链接的地址。
在执行上下文保存操作后,会更新A[11]的返回地址:
- 对于调用,用函数返回地址更新A[11](RA)。
- 对于同步Trap,A[11](RA)更新为引发trap的指令的PC。
- 对于一个系统调用和一个异步Trap或一个中断,一个A[11](RA)被更新为下一个要执行的指令的PC。
PCX、FCX、LCX:这三个上下文管理寄存器是指针,在上下文保存和恢复操作期间使用。
PCX(Previous Context List):PCX寄存器保存了前一个进程的CSA地址。PCX是PCXI寄存器的一部分。
LCX:释放CSA链表限制指针寄存器。
FCX(Free Context List):未使用的CSA表头指针(FCX)寄存器保存了未使用的CSA表头指针,总是指向一个可用的CSA。
5.带有中断和Trap的下文切换
当中断或Trap(例如NMI或SYSTRAP)发生时,处理器将当前任务的上层上下文保存在内存中,暂停当前任务的执行,然后开始执行中断或Trap处理程序。
6.函数调用的上下文切换
在进行函数调用时(执行call指令),必须保存调用例程的上下文,然后恢复调用者从函数返回后的执行。
在函数调用时,硬件保存了整个上层上下文寄存器集。此外,调用指令对上层上下文的保存与调用跳转并行进行。此外,恢复upper context是由RET (Return)指令执行的,与返回跳转并行进行。被调用函数不需要保存和恢复调用者的上下文,并且不需要限制对上层上下文寄存器的使用。被调用函数和被调用函数必须在低层上下文寄存器的使用上相互配合。
7.CSA初始化代码
启动代码初始化CSA主要是建立链表关系,设置链表头(PCX)和尾(LCX),如下图示。