原文作者1:keluoze
原文作者2:xiaolangyangyang
原文地址1:http://home.eeworld.com.cn/my/space-uid-566817-blogid-239332.html
原文地址2:http://blog.csdn.net/xiaolangyangyang/article/details/51768462
版权声明:转载只为交流学习,版权属于原作者
条件标识位 保留 控制位
31 30 29 28 27 26 25 24 … 8 7 6 5 4 3 2 1 0
N Z C V . . . … I F T M4 M3 M2 M1 M0
说明:
条件标识位[31 : 28]:它们的内容可被算术或逻辑运算的结果所改变,并且可以决定某条指令是否被执行。在ARM状态下,绝大多数指令都是有条件的执行的,在Thumb状态下,只有分支指令被有条件的执行
N:当用两个补码表示的带符号数进行运算时,N=1 表示运算的结果为负数;N=0 表示运算的结果为正数或零;
Z:Z=1 表示运算的结果为零;Z=0表示运算的结果为非零;
C:可以有4种方法设置C的值:
─ 加法运算(包括比较指令CMN):当运算产生了进位时(无符号数溢出),C=1,否则C=0。─ 减法运算(包括比较指令CMP):当运算时产生了借位(无符号数溢出),C=0,否则C=1。
─ 对于包含移位操作的非加/减运算指令,C为移出值的最后一位。
─ 对于其他的非加/减运算指令,C的值通常不改变。
V:可以有2种方法设置V的值:
─ 对于加/减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出。
─ 对于其他的非加/减运算指令,C的值通常不改变。
保留位[27 : 8]:当改变PSR中的条件码标志位或者控制位时,保留位不要被改变,在程序中也不要使用保留位来存储数据。保留位将用于ARM版本的扩展。
控制位[7 : 0]:PSR的低8位(包括I、F、T和M[4:0])称为控制位,当发生异常时这些位可以被改变。如果处理器运行特权模式,这些位也可以由程序修改。
I:I =1 表示禁止外部(硬件)中断(IRQ)
F:F=1 表示快速中断(FIQ)
T:反映处理器的运行状态。
对于ARM体系结构v5及以上的版本的T系列处理器,当该位为1时,程序运行于Thumb状态,否则运行于ARM状态。对于ARM体系结构v5及以上的版本的非T系列处理器,当该位为1时,执行下一条指令以引起为定义的指令异常;当该位为0时,表示运行于ARM状态。
运行模式位M[4 : 0]:M0、M1、M2、M3、M4是模式位。这些位决定了处理器的运行模式。具体含义如表2-2所示:
表2-2 运行模式位M[4:0]的具体含义
M[4:0] 处理器模式 可访问的寄存器
0b10000 用户模式 PC,CPSR,R0-R14
0b10001 FIQ模式 PC,CPSR, SPSR_fiq,R14_fiq-R8_fiq, R7~R0
0b10010 IRQ模式 PC,CPSR, SPSR_irq,R14_irq,R13_irq,R12~R0
0b10011 管理模式 PC,CPSR, SPSR_svc,R14_svc,R13_svc,,R12~R0,
0b10111 中止模式 PC,CPSR, SPSR_abt,R14_abt,R13_abt, R12~R0,
0b11011 未定义模式 PC,CPSR, SPSR_und,R14_und,R13_und, R12~R0,
0b11111 系统模式 PC,CPSR(ARM v4及以上版本), R14~R0
7种运行模式:
用户模式(usr):ARM处理器正常的程序执行状态,不能直接切换到其他模式
快速中断模式(fiq):用于高速数据传输或通道处理,FIQ异常响应时进入此模式
外部中断模式(irq):用于通用的中断处理,IRQ异常响应时进入此模式
管理模式(svc):操作系统使用的保护模式,系统复位和软件中断响应时进入此模式(由系统调用执行软中断SWI命令触发)
系统模式(sys):运行具有特权的操作系统任务,与用户模式类似,但具有可以直接切换到其他模式等特权
数据访问中止模式(abt):当数据或指令预取终止时进入该模式,用于支持虚拟内存和/或存储器保护,在ARM7TDMI没有大用处
未定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真
硬件权限级别:系统模式 > 异常模式 > 用户模式
异常模式优先级:SVC>FIQ>IRQ>ABT>UND
寄存器组织:
ARM状态:
R0~R14 通用寄存器
R0~R7 未分组寄存器,所有7种运行模式下指向同一物理寄存器,在中断或异常处理等模式转换时,需防止寄存器中数据的破坏。
R8~R14 分组 根据不同的运行模式访问不同的物理寄存器
R8~R12 除fiq外,其余同usr模式
R13~R14 除usr、sys外,其余有各自分组模式
R15 PC 程序计数器
R16 状态寄存器 CPSR通用; SPSR 除usr、sys外,用于异常保护的CPSR的备份,异常时,保存CPSR值,异常退出时,将该值恢复到CPSR
Thumb状态:
R0~R7 通用
SP对应ARM状态R13
LR对应ARM状态R14
PC对应ARM状态R15
CPSR和SPSR与ARM状态同
R13 -SP stack pointer 堆栈指针,用于取指令操作
R14 -LR Load register 用于程序调用
PC -程序计数器,总是指向当前指令的下两条指令,即PC值为当前指令地址值加8个字节
Linux操作系统与ARM工作模式
接着,bootloader引导Linux内核,此时、Linux内核一样运行在ARM的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的用户模式。