下图有9中模式,其中在Secure和Non-Secure状态下都适用的有七种,分别是User、FIQ、IRQ、Supervisor、Abort、Undefined和System。
之所以记录ARM的这些工作模式,是因为在ARM的中断和异常中,经常会有工作模式的切换,而中断和异常也是ARM中很重要的一点,所以在这里记录一下工作模式的一些概念和一些细节。
其中User模式是非特权模式,其他六种都是特权模式,特权模式中的每一种模式相互之间可以通过软件操作随便切换,也可以切换到User模式下,但是User模式不能通过软件操作切换到其他模式。
ARM的这七种工作模式每一种都对应一组“独立”的寄存器:
以上图中的红字是我为了方便描述自己标的,并不是寄存器名,而且不分先后顺序。
注:
‡:表示安全扩展的一部分。仅在安全状态下存在。
†:表示虚拟化扩展的一部分。仅在非安全状态下存在。
空白地方的单元格表示使用了User模式寄存器。
每种模式都有15个通用寄存器与之对应,但是在异常模式(FIQ、IRQ、Supervisor、Abort、Undefined)中,每个模式都有自己特有的SP(R13)和LR(R14)寄存器(硬件上),FIQ模式还有自己独立的R8~R12寄存器(硬件上),举个例子,在FIQ模式中,R0的值与非异常模式下R0的值是一样的,是通用的,而FIQ模式下R8的值和非异常模式下R8的值(一般)是不一样的,是独立的,是不通用的,它是FIQ模式专属的。所以通用寄存器总共有31个(如上图红字所表序号,不分先后顺序)。
User mode:操作系统以用户模式运行应用程序,以限制系统资源的使用。通常应用程序都在用户模式下执行,在用户模式下运行的程序:
①仅对系统资源进行非特权访问,即不能访问受保护的系统资源。
②只对内存进行非特权访问。
③除非引起异常,否则不能更改工作模式。
System mode:系统模式具有与用户模式相同的寄存器,任何异常都不会进入系统模式。
Supervisor mode:当复位或软件中断指令执行是会进入这种模式。
Abort mode:当发生数据存取异常或指令预取异常会进入这种模式。
Undefined mode:当执行未定义的指令时会进入这种模式。
FIQ mode:当发生快速中断时会进入这种模式。
IRQ mode:当发生IRQ中断时会进入这种模式。
还是这张图,有一个问题就是为什么FIQ模式专属的寄存器比其他模式多?
FIQ模式的专属寄存器有R8_fiq、R9_fiq、R10_fiq、R11_fiq、R12_fiq、SP_fiq、LR_fiq。
答:
FIQ是快速中断模式,而中断的过程是:保存现场——处理中断——恢复现场。其中保存和恢复现场要保存的东西之一就有被中断模式寄存器,而在进入FIQ中断时,只需保存R0~R7,其他的寄存器可以使用FIQ模式专属的寄存器,所以相对其他中断,FIQ中断所需保存现场和恢复现场的时间相对较少(因为保存和恢复的寄存器少了)。但很可惜,FIQ中断使用的场景并不多。。
这些工作模式是通过程序状态寄存器(Program Status Registers (PSRs))来判断的,在应用程序下用的是APSR(The Application Program Status Register),在用户模式下用的是CPSR(The Current Program Status Register ),在进入异常模式时,SPSR(The Saved Program Status Registers )会保存进入异常模式之前CPSR的值,异常处理完毕后,会将SPSR的值恢复给CPSR。每个异常模式下都有自己专属的SPSR。
CPSR和SPSRs的描述: