SPARC结构与实时内核的移植
1.寄存器窗口
SPARC结构继承伯克利RISC结构,寄存器窗口是其一个重要特性。寄存器窗口又称寄存器组,且该组寄存器只对当前运行程序可见。一个寄存器窗口包含32个无浮点寄存器,根据其使用习惯通常记为g0,...,g7;l0,...l7;i0,...,i7;o0,...,o7。其中 g0,...,g7为全局寄存器,其余24个为当前窗口寄存器。如图1。
图1:寄存器窗口 |
特殊寄存器%PSR、%WIM
处理器状态(Processor State Register)寄存器。Bit0~Bit4为当前窗口指针(CWP)。Bit5为Trap开关(ET)。Bit8~Bit11为中断优先级(PIL)。其中CWP与寄存器窗口操作相关,ET与Trap处理相关,PIL与中断处理相关。
无效窗口标识(Windows Invalid Register)寄存器。Bit0~Bit7分别对应窗口0~7,当该位值为1时表示对应窗口为无效窗口。注意,%WIM只能有一位为1,即在CPU的8个寄存器窗口中只能存在一个窗口为无效窗口。
寄存器窗口的状态与相关操作
每个寄存器窗口都可以划分到以下四个状态之中:Current态、Invalid态、Used态和Unused态。假设CWP值为5,%WIM值为0x01,那么寄存器窗口组可以进行如下划分:
W0:Invalid;W1~W4:Unused;W5:Current;W6~W7:Used。
Overflow:当前语句为SAVE指令,并且CWP-1对应的窗口为无效窗口时,发生Overflow Trap。因为在程序调用时每出现一个新的子程序就对应一个SAVE语句,当子程序调用级数大于寄存器窗口数时,就会出现寄存器窗口用完的情况,从而需要进行Overflow Trap的处理,通常是将Used态的寄存器窗口的寄存器值保存在RAM中。
Underflow:当前语句为RESTORE指令,并且CWP+1对应的窗口为无效窗口时,发生Underflow Trap。通常RESTORE的内容是之前Overflow Trap处理时保存到RAM中的,当恢复到原来窗口时需要从RAM中读出到寄存器。
2.堆栈结构
堆栈帧
根据SPARCV8手册的附录D,每个程序都对应一个堆栈帧。每个帧包括四个基本组成部分。从%sp开始,第一部分大小为16个字,用来在Overflow Trap和Underflow Trap时保存当前窗口的inputs寄存器和local寄存器。第二部分大小为1个字,用来传递隐藏参数。当前子程序返回值不是一个变量,而是一个数据结构时,该参数可以是指向该数据结构的指针。第三部分大小为6个字,分别对应六个入口参数。这三部分是编译器为每个子程序的常规分配。其余的为第四部分,大小不确定,通常包含当前子程序中包含的Auto型的变量、数据结构等等。
通常%sp为栈顶指针,%fp为栈帧指针,相当于当前栈的栈底。并且%sp就是%o6,%fp就是%i6,所以编译器通常用语句(SAVE %sp,—0x148,%sp)来为新的线程分配一个新的栈帧。
图2:中断栈结构
评论