目录
1.CPU工作模式(Mode)
2.状态(State)
3.寄存器
1.CPU工作模式(Mode)
ARM CPU有七种模式,各种模式如下图所示。注意用户模式下不可进入其他模式,用户模式是在有操作系统的时候给应用程序使用的,写应用程序的人水平千差万别,不能保证写的程序是好是坏,所以让应用程序运行在用户模式,限制应用程序的权限,防止破坏整个系统,
1、用户模式(usr):正常的程序执行状态
2、快速中断模式(fiq): 处理快速中断,支持高速数据传送或通道处理
3、中断模式(irq): 处理普通中断
4、管理模式(svc):操作系统使用的保护模式
5、系统模式(sys):运行具有特权的操作系统任务
6、数据访问终止模式(abt):数据或指令预取终止时进入该模式
7、未定义指令终止模式(und):未定义的指令执行时进入该模式
除用户模式外,其余6种工作模式都属于特权模式;
特权模式中除了系统模式以外的其余5种模式称为异常模式;
大多数程序运行于用户模式;
进入特权模式是为了具有更高的权限去处理中断、异常、或者访问被保护的系统资源;
2.状态(State)
ARM架构的CPU有ARM state和Thumb state,
ARM State:用的是ARM指令集,每个指令占据4 byte,
Thumb State:用的是Thumb指令集,每个指令2 byte.
比如对于同样的一条指令,MOV R0,R1 对于ARM指令集就要占据四个字节,对于Thumb指令集占据两个字节,这里的占据几个字节是指这条汇编指令会编译成机器码之后占据几个字节。我们引入Thumb指令集是为了减少存储程序的空间,这对单片机特别有效,单片机的flash空间比较小,所以我们要减少程序存储的空间,但是在我们的嵌入式linux中,我们的norflash足够大,不需要节省空间,所以我们一直使用的是ARM指令集。
Thumb是ARM体系结构中一种16位的指令集。Thumb指令集可以看作是ARM指令压缩形式的子集,它是为减小代码量而提出,具有16bit的代码密度。Thumb指令体系并不完整,只支持通用功能,必要时仍需要使用ARM指令,如进入异常时。其指令的格式与使用方式与ARM指令集类似,而且使用并不频繁,Thumb指令集作一般了解。
3.寄存器
每种异常模式主要差别就在于寄存器的差别,
我们可以看到在所有的7种模式下我们都可以使用r0-r15.但是有些寄存器画有灰色三角形,这表明在该模式下面访问到这些寄存器的时候,访问到的是这个模式下专属的寄存器,比如在FIQ模式下,我们访问R8的时候,访问的是FIQ模式下它专属R8寄存器,这时候访问到的R8和用户模式下访问到的R8寄存器不是同一个物理寄存器,我们可以看到在后面的5种模式下,R13,R14都是专用寄存器,其中R13用作栈,R14用作LR返回地址,也就是每种异常模式下我们可以分别设置它的栈,然后LR用来保存发生异常时的指令地址。
下面我们看一下程序状态寄存器,CPSR当前程序状态寄存器,SPSR(saved)保存的程序状态寄存器,用来保存被中断模式的CPSR,低位的M4-M0表示当前CPU处于哪种模式,然后T表示CPU工作与ARM State还是Thumb state,F表示FIQ disable,当该位为1时,所有的FIQ是禁止的。bit28-31是状态位,比如当我们执行cmp R0,R1 beq xx.如果R0=R1,那么状态位的Zero位就是1,然后beq指令会来判断Zero位是否为1,为1则跳转。
我们来看一下异常的处理流程,上图是进入异常时的步骤,上图是硬件部分实现的,
- 发生异常时我们的CPU首先把被中断的下一条指令的地址保存到LR寄存器里面,有可能是PC+4,有可能是PC+8,到底是哪个值取决于不同的情况。
- 然后把CPSR保存到SPSR中
- 然后修改CPSR的模式位,让CPU进入某种异常模式,
- 然后跳到向量表,
然后看一下离开异常时要做什么
- 首先让LR寄存器减去某个offset,至于减去什么值看上面的表格,
- 然后把CPSR的值恢复。
- 然后是清除中断。