下图有9中模式,其中在Secure和Non-Secure状态下都适用的有七种,分别是User、FIQ、IRQ、Supervisor、Abort、Undefined和System。

arm架构的bios怎么进 arm 模式_ARM


       之所以记录ARM的这些工作模式,是因为在ARM的中断和异常中,经常会有工作模式的切换,而中断和异常也是ARM中很重要的一点,所以在这里记录一下工作模式的一些概念和一些细节。

       其中User模式是非特权模式,其他六种都是特权模式,特权模式中的每一种模式相互之间可以通过软件操作随便切换,也可以切换到User模式下,但是User模式不能通过软件操作切换到其他模式。       ARM的这七种工作模式每一种都对应一组“独立”的寄存器:

arm架构的bios怎么进 arm 模式_arm架构的bios怎么进_02


       以上图中的红字是我为了方便描述自己标的,并不是寄存器名,而且不分先后顺序。

       注:

       ‡:表示安全扩展的一部分。仅在安全状态下存在。

       †:表示虚拟化扩展的一部分。仅在非安全状态下存在。

       空白地方的单元格表示使用了User模式寄存器。

每个模式都有自己特有的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。

arm架构的bios怎么进 arm 模式_arm架构的bios怎么进_02


       答:

       FIQ是快速中断模式,而中断的过程是:保存现场——处理中断——恢复现场。其中保存和恢复现场要保存的东西之一就有被中断模式寄存器,而在进入FIQ中断时,只需保存R0~R7,其他的寄存器可以使用FIQ模式专属的寄存器,所以相对其他中断,FIQ中断所需保存现场和恢复现场的时间相对较少(因为保存和恢复的寄存器少了)。但很可惜,FIQ中断使用的场景并不多。。

在进入异常模式时,SPSR(The Saved Program Status Registers )会保存进入异常模式之前CPSR的值,异常处理完毕后,会将SPSR的值恢复给CPSR。每个异常模式下都有自己专属的SPSR。

       CPSR和SPSRs的描述:

arm架构的bios怎么进 arm 模式_ARM工作模式_04