一、ARMv7-A处理器模式
ARMv7架构支持安全扩展,如果使能了安全扩展,ARMv7-A架构分为安全模式(Secure State)和非安全模式(Non-secure State)两个世界。
在非安全模式下,存在三种运行特权PL0,PL1和PL2(privilege level)。
If the Virtualization Extensions are implemented there is a privilege model different to that of previous architectures. In Non-secure state there can be three privilege levels, PL0, PL1 and PL2.
特权等级 | 描述 |
---|---|
PL0 | PL0运行在用户模式(User),用于运行应用程序。该模式程序受限访问系统资源。对应Linux用户态。 |
PL1 | PL1运行非用户模式和Hyp模式外的所有模式。Linux内核运行在PL1。包含了ARMv6架构中的System,SVC,FIQ,IRQ,UNDEF及Abort模式。此外,安全模式中的Montior也运行在PL1等级,管理安全模式和非安全模式的切换。 |
PL2 | PL2用于虚拟化。虚拟化超级管理程序(Hypervisor)运行在PL2。 |
二、ARMv7-A通用寄存器
ARMv7-A架构提供了16个32位通用寄存器(R0-R15)和一个程序状态寄存器CPSR(Current Program Status Register),在异常模式下,可以访问SPSR(Saved Program Status Register),在异常模式下,SPSR用于保存当前CPSR寄存器值。其中R0-R14可以用于普通数据存储,R15是程序计数器PC(program counter)。
以上寄存器可能因运行模式不同而对应不同的物理存储位置,上图中蓝色区域即如此,它们使用不同的物理存储,通常只有在进程以特定模式执行时才可访问。
- R0-R7在任何模式下都对应相同的物理存储,称之为未分组寄存器;
- R8-R14根据模式不同对应不同的物理存储,称之为分组寄存器;
- R13(SP)在User和Sys模式下对应相同的物理存储,FIQ,IRQ,ABT,SVC,UND,MON,HYP模式分别对应不同的物理存储。R13在ARM架构中用于SP堆栈指针(stack pointer)。MON模式用于管理安全与非安全模式,HYP模式用于管理虚拟操作系统(GuestOS)。
- R14(LR)在User,Sys和HYP模式下对应相同的物理存储,FIQ,IRQ,ABT,SVC,UND,MON模式分别对应不同的物理存储。R14在ARM架构中用于LR链接寄存器,在每种模式下,R14用于保存子程序返回地址。执行BL指令时,R14用于备份R15寄存器的值。
- R15(PC)保存当前程序执行的地址。在所有模式下,R15(PC)共享相同的物理存储。在ARM状态下,[1:0]为0,[31:2]用于保存PC。在Thumb状态下,[0]为0,[31:1]用于保存PC。
- CPSR是程序状态寄存器,保存条件标志位,中断禁止位,当前处理器模式等控制和状态位。每种异常模式下还存在SPSR,保存进入异常模式前的CPSR寄存器值,用于异常处理完成后恢复CPSR的状态。User和Sys不属于异常模式,没有CPSR寄存器,在User模式下,受限的CPSR寄存器称谓APSR( Application Program Status Register)。ARMv7-A中CPSR寄存器的信息如下图所示。
各Field代表含义如下:
Field | 作用 |
---|---|
N | ALU返回运算结果是否为负数 |
Z | ALU返回运算结果是否为0 |
C | ALU运算是否发生进位 |
V | ALU运算是否发生溢出 |
Q | cumulative saturation |
J | ARM是否处于 Jazelle 状态 |
E | 控制load/store字节序 |
A | disables asynchronous aborts,User模式不能操作 |
I | 使能/去使能IRQ,User模式不能操作 |
F | 使能/去使能FIQ,User模式不能操作 |
T | ARM和Thumb状态标志位 |
GE | 用于某些SIMD(Single Instruction, Multiple Data)指令 |
M[4:0] | 处理器模式:FIQ,IRQ,ABT,SVC,UND,MON,HYP。User模式不能操作 |
三、ARMv7-A协处理器CP15寄存器
ARMv7-A架构保护系统控制协处理器CP15,主要用于处理存储系统相关的功能。CP15只能在特权模式下访问。CP15提供了16个32位主寄存器,命名为c0-c15。c0-c15寄存器可能对应多个不同的物理寄存器。
register | physical register | 描述 |
---|---|---|
c0 | MIDR | 主ID寄存器,用于记录厂商版本信息 |
MPIDR | Multiprocessor Affinity Register | |
c1 | SCTLR | 系统控制寄存器 |
ACTLR | 辅助控制寄存器 | |
CPACR | 协处理器访问控制寄存器,控制访问除了CP14和CP15的协处理器 | |
SCR | 安全配置寄存器 | |
c2 c3 | TTBR0 | 一级转换页表基址寄存器0 |
TTBR1 | 一级转换页表基址寄存器1 | |
TTBCR | 页表转换控制寄存器 | |
c5 c6 | DFSR | 数据异常(Data Fault)状态寄存器 |
IFSR | 指令异常(Instruction Fault)状态寄存器 | |
DFAR | 数据异常(Data Fault)地址寄存器 | |
IFAR | 指令异常(Instruction Fault)地址寄存器 | |
c7 | predictor | cache及分支预测 |
barrier | 数据及指令屏障 | |
c8 | TLB | TLB操作 |
c9 | performance monitors | 性能监视器 |
c12 | VBAR | 非安全模式异常基址寄存器 |
MVBAR | 安全模式异常基址寄存器 | |
c13 | ASID | 上下文ID寄存器,软件线程ID寄存器 |
c15 | CBAR | 配置基址寄存器,用于GIC(Generic Interrupt Controller)和定时器类型外设 |
协处理器CP15寄存器访问包括读和写操作。
- 读操作即将CP15内的寄存器CRn的值读到通用寄存器Rt中,使用指令语法MRC, Op1, Rt, CRn, CRm, Op2;
- 写操作即将通用寄存器Rt的值写入CP15内的寄存器CRn中,使用指令语法MCR, Op1, Rt, CRn, CRm, Op2;
- MRC:将CP15寄存器值读到ARM通用寄存器;
- MCR:将ARM通用寄存器值写到CP15寄存器;
- Op1 :协处理行为操作码;
- Rt :ARM通用寄存器,不能是R15(PC);
- CRn:协处理器CP15寄存器c0-c15;
- CRm:附加目标寄存器,不需要附加信息,则设置为c0;
- Op2 :区分同一编号不同的物理寄存器,例如分别访问c0中的MIDR和MPIDR,Op2值分别为0和1。默认情况下设置为0;
示例:
将CP15寄存器c0的MIDR寄存器读到R1中。
MRC p15, 0, R1, c0, c0, 0
- 1
四、系统控制寄存器CP15.SCTLR
系统控制寄存器SCTLR(System Control Register )用于控制内存,系统功能以及提供状态信息。
Field | 作用 |
---|---|
TE | Thumb异常使能 |
NMFI | 不可屏蔽FIQ |
EE | 异常字节序 |
U | 对齐模使用标志 |
FI | FIQ配置使能 |
V | 选择异常向量表基址 |
I | 指令cache使能位 |
Z | 分支预测使能位 |
C | cache使能位 |
A | 对齐检测使能位 |
M | MMU使能位 |
示例:
初始化CP15:SCTLR,使能Cache,指令Cache及分支预测功能。