ARM V7A 体系结构-第三章 ARM处理器模式和寄存器

ARM V7A体系-第三章 ARM处理器模式和寄存器

1.模式介绍

如下图所示,有六种特权模式和一种非特权用户模式(新版本的ARM v7为支持TrustZone 安全扩展和HYP虚拟化新增了monitor模式和HYP模式)
在这里插入图片描述
用户模式是无法操作硬件的,比如修改某些寄存器值,修改MMU配置或cache的操作。用户的应用程序通常在用户态工作,而操作系统通常工作在System模式下,若用户想要操作硬件需要引发系统调用陷入到内核态,需要借助系统调用,本质上是产生一个软中断。

安全模式的引入新加了两种状态,区别于特权和非特权,是安全模式和非安全模式,如下图在这里插入图片描述
在这种情况下,Monitor模式充当了安全区域和非安全区域的桥梁,常见的应用比如指纹支付,在安全区域单独运行一个trusted os用于指纹的存储和算法识别等操作,然后应用程序在非安全区域中仅取到相应的识别结果,保证了指纹数据安全性,防止指纹数据被入侵系统后恶意修改造成失效等。

hyp模式的加入用于虚拟化的设计,可一个系统中运行多个os,如下图所示
在这里插入图片描述上图中Guset OS就表示运行的虚拟机,例如可在同一块硬件上同时运行linux和vxworks等,就跟平时开发linux使用的vmware虚拟机,原理类似。
如果实现了虚拟化扩展,则存在与以前体系结构不同的特权模型。在非安全状态下,可以有三个特权级别:PL0、PL1和PL2。如下图
在这里插入图片描述

2.寄存器

ARM V7 提供16个32位通用寄存器,前 15 个(R0~R14)可以用作通用的数据存储, R15 是程序计数器 PC,用来保存将要执行的指令。还提供了一个当前程序状态寄存器 CPSR(current program status register) 和一个备份程序状态寄存器 SPSR(saved program status register), SPSR 寄存器就是 CPSR 寄存器的备份。
上节介绍到ARM V7有9种模式,每一种运行模式都有一组与之对应的寄存器组。每一种模式可见的寄存器包括 15 个通用寄存器(R0~R14)、两个程序状态寄存器和一个程序计数器 PC。在这些寄存器中,有些是所有模式所共用的同一个物理寄存器,有一些是各模式自己所独立拥有的,各个模式所拥有的寄存器如下图
在这里插入图片描述
如上图所示,R0-R7和R15在所有模式中是公用的,而比如FIQ模式,R8-R14是独立的,这样设计就是为了加快中断响应速度,避免了其余寄存器的压栈出栈,节省了时间,所以这个模式叫快速中断模式。各模式下访问相应的寄存器是首先取决于模式的,比如在SVC模式下访问的sp就是SVC的sp,在IRQ模式下访问的sp就是IRQ的sp。
sp是堆栈寄存器,是调用c语言的必须条件,因此通常在系统启动时,在中断向量表的入口处都会进行初始化,但是若当前模式无需调用c函数,则此寄存器可用作普通寄存器使用。
lr是链接寄存器,是用于在函数调用过程中记录函数的返回地址的,例如使用BL指令进行函数调用,则会自动将返回地址保存到lr寄存器中,以便在函数结束时返回到上级函数。看过汇编代码的朋友应该有观察到,通常函数在入口的时会使用push {lr}等类似操作,将lr寄存器保存到栈里,而退出时通常使用pop {pc},将上级函数的地址赋值给pc指针。
pc是程序寄存器,是保存当前程序的运行地址,确切的说由于存在流水线的缘故,pc并不是指向当前正在运作的地址,而是指向当前正在取指的地址。ARM 处理器 3 级流水线:取指->译码->执行,如下图
在这里插入图片描述
由于流水线的存在,导致PC的值比当前正在执行的值要大两条指令的地址,而在arm状态下,由于是四字节的指令因此PC保存着当前执行的指令地址值加 8 个字节,而在thumb状态下,是两字节的指令因此加4字节即可。pc寄存器的低两位表示指令模式,如果是32位的arm模式,指令地址是四字节对齐的,因此最低两位是0,如果是16位的thumb模式,指令是2字节对齐的,因此最低一位是0。

程序状态寄存器psr,所有的处理器模式都共用一个 CPSR 物理寄存器,因此 CPSR 可以在任何模式下被访问。CPSR 是当前程序状态寄存器,该寄存器包含了条件标志位、中断禁止位、当前处理器模式标志等一些状态位以及一些控制位。所有的处理器模式都共用一个 CPSR 必然会导致冲突,为此,除了 User 和 Sys 这两个模式以外,其他 7 个模式每个都配备了一个专用的物理状态寄存器SPSR(备份程序状态寄存器),当特定的异常中断发生时, SPSR 寄存器用来保存当前程序状态寄存器(CPSR)的值,当异常退出以后可以用 SPSR 中保存的值来恢复 CPSR。
因为 User 和 Sys 这两个模式不是异常模式,所以并没有配备 SPSR,因此不能在 User 和Sys 模式下访问 SPSR,会导致不可预知的结果。由于 SPSR 是 CPSR 的备份,因此 SPSR 和CPSR 的寄存器结构相同,如下图
在这里插入图片描述

N(bit31):当两个补码表示的 有符号整数运算的时候, N=1 表示运算对的结果为负数, N=0表示结果为正数。
Z(bit30): Z=1 表示运算结果为零, Z=0 表示运算结果不为零,对于 CMP 指令, Z=1 表示进行比较的两个数大小相等。
C(bit29):在加法指令中,当结果产生了进位,则 C=1,表示无符号数运算发生上溢,其它情况下 C=0。在减法指令中,当运算中发生借位,则 C=0,表示无符号数运算发生下溢,其它情况下 C=1。对于包含移位操作的非加/减法运算指令, C 中包含最后一次溢出的位的数值,对于其它非加/减运算指令, C 位的值通常不受影响。
V(bit28): 对于加/减法运算指令,当操作数和运算结果表示为二进制的补码表示的带符号数时, V=1 表示符号位溢出,通常其他位不影响 V 位。
Q(bit27): 仅 ARM v5TE_J 架构支持,表示饱和状态, Q=1 表示累积饱和, Q=0 表示累积不饱和。
IT1:0: 和 IT7:2一起组成 IT[7:0],作为 IF-THEN 指令执行状态。
J(bit24): 仅 ARM_v5TE-J 架构支持, J=1 表示处于 Jazelle 状态,此位通常和 T(bit5)位一起表示当前所使用的指令集,00-ARM,01-Thumb,11-ThumbEE,10-Jazelle
GE3:0: SIMD 指令有效,大于或等于。
IT7:2: 参考 IT[1:0]。
E(bit9): 大小端控制位, E=1 表示大端模式, E=0 表示小端模式。
A(bit8): 启用或禁用内存对齐异常
I(bit7): I=1 禁止 IRQ, I=0 使能 IRQ。
F(bit6): F=1 禁止 FIQ, F=0 使能 FIQ。
T(bit5): 控制指令执行状态,表明本指令是 ARM 指令还是 Thumb 指令,通常和 J(bit24)一起表明指令类型,参考 J(bit24)位。
M[4:0]: 处理器模式控制位,如下表
在这里插入图片描述

3.协处理器CP15

协处理器提供内核的一些系统配置功能,一共有16个32bit的协处理器,简写为C0-15。对CP15的访问受权限控制,并非所有寄存器都在用户模式下可用。
通过协处理器指令 MCR和 MRC 提供具体的寄存器来配置和控制 caches、MMU、保护系统、配置时钟模式(在 bootloader时钟初始化用到)等。
在这里插入图片描述

3.1、指令格式

MCR:将ARM处理器的寄存器中的数据传送到协处理器寄存器中。如果协处理器不能成功地执行该操作,将产生未定义的指令异常中断。
MRC:将协处理器的寄存器中的数值传送到ARM处理器的寄存器中、如果协处理器不能成功地执行该操作,将产生未定义的指令异常中断。在这里插入图片描述
在这里插入图片描述
此部分很多内容详解都在后续章节中,此处先不展开描述

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值