ARM处理器工作状态和模式

两种工作状态

1、ARM状态:处理器执行32位对齐的ARM指令;
2、Thumb状态:处理器执行16位对齐的ARM指令。
它们之间的区别在于:Thumb指令集不是完整的指令集,它是ARM指令集的子集。但是Thumb指令具有更高的代码密度,即占用存储空间小,仅为ARM代码规格的65%,但其性能却下降的很少。所以,Thumb指令集使ARM处理器能应用到有限的存储带宽,并且,代码密度要求很高的嵌入式系统中去。Thumb指令集没有协处理器指令、信号量指令以及访问CPSR或SPSR的指令,没有乘加指令及64位乘法指令等,且指令的第二操作数受到限制;除了跳转指令B有条件执行功能外,其他指令均为无条件执行;大多数Thumb数据处理指令采用2地址格式。

七种工作模式

1、用户模式(Usr):用于正常执行程序;
2、快速中断模式(FIQ):用于高速数据传输;
3、外部中断模式(IRQ):用于通常的中断处理;
4、管理模式(svc):操作系统使用的保护模式;
5、数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储以及存储保护;
6、系统模式(sys):运行具有特权的操作系统任务;
7、未定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件。
除用户模式以外,其余6种模式都属于特权模式。用户模式不能够直接和其他6种模式进行切换,需要借助中断、异常,系统调用等。用户模式主要为了设置应用程序的权限,防止对系统造成破坏,起到保护作用。而其他6种模式直接可以直接进行切换。详情可以看下图:
在这里插入图片描述

两种寄存器

1、CPSR(current program status register):当前程序状态寄存器。

CPSR和其他寄存器不一样,其他寄存器是用来存放数据的,都是整个寄存器具有一个含义.而CPSR寄存器是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息.(CPSR寄存器为32位)
在这里插入图片描述
CPSR的低8位(包括I、F、T和M[4:0])称为控制位,程序无法修改,除非CPU运行于特权模式下,程序才能修改控制位!
N、Z、C、V均为条件码标志位。它们的内容可被算术或逻辑运算的结果所改变,并且可以决定某条指令是否被执行!意义重大!

在这里插入图片描述
从对应表中可以看出M[4:0]各种状态表示的含义。

2、SPSR(Saved Program Status Register):程序状态保存寄存器

当切换进入某一个特权模式时,SPSR保存前一个工作模式的CPSR值,这样,当返回前一个工作模式时,可以将SPSR的值恢复到CPSR中;
总结如下:1.保存ALU中的当前操作信息;
2.控制允许和禁止中断;
3.设置处理器的运行模式。

ARM中有两条指令用于在状态寄存器和通用寄存器之间传送数据。即MRS、MSR。在对CPSR,SPSR寄存器进行操作不能使用mov,ldr等通用指令,只能使用特权指令MRS和MSR。

在ARM处理器中,只有MRS(Move to Register from State register)指令可以对状态寄存器CPSR和SPSR进行读操作。通过读CPSR可以获得当前处理器的工作状态。读SPSR寄存器可以获得进入异常前的处理器状态(因为只有异常模式下有SPSR寄存器)。
比如:

MRS    R1,CPSR   ; 将CPSR状态寄存器读取,保存到R1中
MRS    R2,SPSR    ; 将SPSR状态寄存器读取,保存到R2中

MSR    CPSR_c,R0 ; 将修改后的值写回 CPSR寄存器的对应控制域

linux操作系统与ARM工作模式

首先,ARM开发板在刚上电或者复位后,都会首先进入SVC即管理模式,此时、程序计数器R15-PC会被自动赋值为0x0000 0000,bootloader就是在该模式下,位于0x0000 0000 的NOR FLASH或SRAM中装载的,因此,开机或重启后bootloader会被首先执行。
接着,bootloader引导linux内核,此时,linux内核仍然运行在SVC即管理模式下,当内核启动完毕后,进入用户态init进程时,内核将ARM的当前程序状态CPSR寄存器M[4:0]设置为10000,进而用户态程序只能运行在ARM的用户模式。
由于ARM用户模式下对资源的访问时受限制的,因此,用户态可以实现对linux操作系统内核保护的目的。
需要强调的是:Linux内核态是从ARM的SVC即管理模式下启动的,但在某些情况下、如:硬件中断、程序异常(被动)等情况下进入ARM的其他特权模式,这时仍然可以进入内核态(因为就是可以操作内核了);同样,Linux用户态是从ARM用户模式启动的,但当进入ARM系统模式时、仍然可以操作Linux用户态程序(进入用户态,如init进程的启动过程)。
即:Linux内核从ARM的SVC模式下启动,但内核态不仅仅指ARM的SVC模式(还包括可以访问内核空间的所有ARM模式);Linux用户程序从ARM的用户模式启动,但用户态不仅仅指ARM的用户模式。

发布了29 篇原创文章 · 获赞 1 · 访问量 552

猜你喜欢

转载自blog.csdn.net/qq_45173769/article/details/103551981