ARMv8的架构继承以往ARMv7与之前处理器技术的基础,除了现有的16/32bit的Thumb2指令支持外,也向前兼容现有的A32(ARM 32bit)指令集,基于64bit的AArch64架构,除了新增A64(ARM 64bit)指令集外,也扩充了现有的A32(ARM 32bit)和T32(Thumb2 32bit)指令集,另外还新增加了CRYPTO(加密)模块支持。
AArch32 | 描述32bit Execution State |
AArch64 | 描述64bit Execution State |
A32、T32 | AArch32 ISA (Instruction Architecture) |
A64 | AArch64 ISA (Instruction Architecture) |
Interprocessing | 描述AArch32和AArch64两种执行状态之间的切换 |
SIMD | Single-Instruction, Multiple-Data (单指令多数据) |
(参考文档:ARMv8-A Architecture reference manual-DDI0487A_g_armv8_arm.pdf)
• ARMv8 提供AArch32 state和 AArch64 state 两种Execution State,下面是两种Execution State对比.
Execution State | Note |
AArch32 | 提供13个32bit通用寄存器R0-R12,一个32bit PC指针 (R15)、堆栈指针SP (R13)、链接寄存器LR (R14) |
提供一个32bit异常链接寄存器ELR, 用于Hyp mode下的异常返回 | |
提供32个64bit SIMD向量和标量floating-point支持 | |
提供两个指令集A32(32bit)、T32(16/32bit) | |
兼容ARMv7的异常模型 | |
协处理器只支持CP10CP11CP14CP15 | |
AArch64 | 提供31个64bit通用寄存器X0-X30(W0-W30),其中X30是程序链接寄存器LR |
提供一个64bit PC指针、堆栈指针SPx 、异常链接寄存器ELRx | |
提供32个128bit SIMD向量和标量floating-point支持 | |
定义ARMv8异常等级ELx(x<4),x越大等级越高,权限越大 | |
定义一组PE state寄存器PSTATE(NZCV/DAIF/CurrentEL/SPSel等),用于保存PE当前的状态信息 | |
没有协处理器概念 |
SPSR_EL1.M[4] 决定EL0的执行状态,为0 =>64bit ,否则=>32bit |
HCR_EL2.RW 决定EL1的执行状态,为1 =>64bit ,否则=>32bit |
SCR_EL3.RW确定EL2 or EL1的执行状态,为1 =>64bit ,否则=>32bit |
AArch32和AArch64之间的切换只能通过发生异常或者系统Reset来实现.(A32 -> T32之间是通过BX指令切换的) |
ELx(x<4),x越大等级越高,执行特权越高
执行在EL0称为非特权执行
EL2 没有Secure state,只有Non-secure state
EL3 只有Secure state,实现EL0/EL1的Secure 和Non-secure之间的切换
EL0 & EL1 必须要实现,EL2/EL3则是可选实现
Exception Level | |
EL0 | Application |
EL1 | Linux kernel- OS |
EL2 | Hypervisor (可以理解为上面跑多个虚拟OS) |
EL3 | Secure Monitor(ARM Trusted Firmware) |
Security | |
Non-secure | EL0/EL1/EL2, 只能访问Non-secure memory |
Secure | EL0/EL1/EL3, 可以访问Non-secure memory & Secure memory,可起到物理屏障安全隔离作用 |
Note | |
Common | User mode 只执行在Non- Secure EL0 or Secure ELO |
SCR_EL3.NS决定的是low level EL的secure/non-secure状态,不是绝对自身的 | |
EL2只有Non-secure state | |
EL0 既有Non-secure state 也有Secure state | |
EL3 AArch64 | 若EL1使用AArch32,那么Non- Secure {SYS/FIQ/IRQ/SVC/ABORT/UND} 模式执行在Non-secure EL1,Secure {SYS/FIQ/IRQ/SVC/ABORT/UND}模式执行在Secure EL1 |
若 SCR_EL3.NS == 0,则切换到Secure EL0/EL1状态,否则切换到Non-secure ELO/EL1状态 | |
Secure state 只有Secure EL0/EL1/EL3 | |
EL3 AArch32 | User mode 只执行在Non- Secure EL0 or Secure ELO |
若EL1使用AArch32,那么Non- Secure {SYS/FIQ/IRQ/SVC/ABORT/UND} 模式执行在Non-secure EL1,Secure {SYS/FIQ/IRQ/SVC/ABORT/UND}模式执行在EL3 | |
Secure state只有Secure EL0/EL3,没有Secure EL1,要注意和上面的情况不同 |
• 当EL3使用AArch64时,有如下结构组合:
五类组合
EL0/EL1/EL2/EL3 => AArch64
此两类组合不存在64bit –> 32bit之间的所谓 Interprocessing 切换
EL0/EL1/EL2/EL3 => AArch32
EL0 => AARCH32,EL1/EL2/EL3 => AArch64
此三类组合存在64bit –> 32bit之间的所谓 Interprocessing 切换
EL0/EL1 => AArch32,EL2/EL3 => AArch64
EL0/EL1/EL2 => AArch32,EL3 => AArch64
组合规则
字宽(ELx)<= 字宽(EL(x+1)) { x=0,1,2 }
原则:上层字宽不能大于底层字宽
• 五类经典组合图示
若SPSR_EL1.M[4] == 0,则决定ELO使用AArch64,否则AArch32
若SCR_EL3.RW == 1,则决定 EL2/EL1 是使用AArch64,否则AArch32
若SCR_EL3.{EA, FIQ, IRQ} == 1,则所有相应的SErrorFIQIRQ 中断都被路由到EL3
若HCR_EL2.RW == 1,则决定EL1使用AArch64,否则使用AArch32
若HCR_EL2.{AMO, IMO, FMO} == 1,则EL1/EL0所有对应的SErrorFIQIRQ中断都被路由到EL2,同时使能对应的虚拟中断VSE,VI,VF
若HCR_EL2.TGE == 1,那么会忽略HCR_EL2.{AMO, IMO, FMO}的具体值,直接当成1处理,则EL1/EL0所有对应的SErrorFIQIRQ中断都被路由到EL2,同时禁止所有虚拟中断
注意: SCR_EL3.{EA, FIQ, IRQ}bit的优先级高于HCR_EL2.{AMO, IMO, FMO} bit优先级,路由优先考虑SCR_EL3
位宽
分类
32-bit
Wn(通用)
WZR(0寄存器)
WSP(堆栈指针)
64-bit
Xn(通用)
XZR(0寄存器)
SP(堆栈指针)
寄存器类型 | Bit | 描述 |
R0-R14 | 32bit | 通用寄存器,但是ARM不建议使用有特殊功能的R13,R14,R15当做通用寄存器使用. |
SP_x | 32bit | 通常称R13为堆栈指针,除了User和Sys模式外,其他各种模式下都有对应的SP_x寄存器:x ={ und/svc/abt/irq/fiq/hyp/mon} |
LR_x | 32bit | 称R14为链接寄存器,除了User和Sys模式外,其他各种模式下都有对应的SP_x寄存器:x ={ und/svc/abt/svc/irq/fiq/mon},用于保存程序返回链接信息地址,AArch32环境下,也用于保存异常返回地址,也就说LR和ELR是公用一个,AArch64下是独立的. |
ELR_hyp | 32bit | Hyp mode下特有的异常链接寄存器,保存异常进入Hyp mode时的异常地址 |
PC | 32bit | 通常称R15为程序计算器PC指针,AArch32 中PC指向取指地址,是执行指令地址+8,AArch64中PC读取时指向当前指令地址. |
CPSR | 32bit | 记录当前PE的运行状态数据,CPSR.M[4:0]记录运行模式,AArch64下使用PSTATE代替 |
APSR | 32bit | 应用程序状态寄存器,EL0下可以使用APSR访问部分PSTATE值 |
SPSR_x | 32bit | 是CPSR的备份,除了User和Sys模式外,其他各种模式下都有对应的SPSR_x寄存器:x ={ und/svc/abt/irq/fiq/hpy/mon},注意:这些模式只适用于32bit运行环境 |
HCR | 32bit | EL2特有,HCR.{TEG,AMO,IMO,FMO,RW}控制EL0/EL1的异常路由 |
SCR | 32bit | EL3特有,SCR.{EA,IRQ,FIQ,RW}控制EL0/EL1/EL2的异常路由,注意EL3始终不会路由 |
VBAR | 32bit | 保存任意异常进入非Hyp mode & 非Monitor mode的跳转向量基地址 |
HVBAR | 32bit | 保存任意异常进入Hyp mode的跳转向量基地址 |
MVBAR | 32bit | 保存任意异常进入Monitor mode的跳转向量基地址 |
ESR_ELx | 32bit | 保存异常进入ELx时的异常综合信息,包含异常类型EC等,可以通过EC值判断异常class |
PSTATE | 不是一个寄存器,是保存当前PE状态的一组寄存器统称,其中可访问寄存器有:PSTATE.{NZCV,DAIF,CurrentEL,SPSel},属于ARMv8新增内容,主要用于64bit环境下 |
A32使用
Rd/Rn编码位宽4位
T32-32bit使用
Rd/Rn编码位宽4位
T32-16bit使用
Rd/Rn编码位宽3位
R0
R0
R0
R1
R1
R1
R2
R2
R2
R3
R3
R3
R4
R4
R4
R5
R5
R5
R6
R6
R6
R7
R7
R7
R8
R8
并不是说T32-16bit下没有R8~R12,而是有限的指令才能访问到,16bit指令的Rd/Rn编码位只有3位,所以Rx范围是R0-R7
R9
R9
R10
R10
R11
R11
R12
R12
SP (R13)
SP (R13)
SP (R13)
LR (R14)
LR (R14) //M
LR (R14) //M
PC (R15)
PC (R15) //P
PC (R15) //P
CPSR
CPSR
CPSR
SPSR
SPSR
SPSR
寄存器类型 | Bit | 描述 |
X0-X30 | 64bit | 通用寄存器,如果有需要可以当做32bit使用:WO-W30 |
LR (X30) | 64bit | 通常称X30为程序链接寄存器,保存跳转返回信息地址 |
SP_ELx | 64bit | 若PSTATE.M[0] ==1,则每个ELx选择SP_ELx,否则选择同一个SP_EL0 |
ELR_ELx | 64bit | 异常链接寄存器,保存异常进入ELx的异常地址(x={0,1,2,3}) |
PC | 64bit | 程序计数器,俗称PC指针,总是指向即将要执行的下一条指令 |
SPSR_ELx | 32bit | 寄存器,保存进入ELx的PSTATE状态信息 |
NZCV | 32bit | 允许访问的符号标志位 |
DIAF | 32bit | 中断使能位:D-Debug,I-IRQ,A-SError,F-FIQ ,逻辑0允许 |
CurrentEL | 32bit | 记录当前处于哪个Exception level |
SPSel | 32bit | 记录当前使用SP_EL0还是SP_ELx,x= {1,2,3} |
HCR_EL2 | 32bit | HCR_EL2.{TEG,AMO,IMO,FMO,RW}控制EL0/EL1的异常路由 逻辑1允许 |
SCR_EL3 | 32bit | SCR_EL3.{EA,IRQ,FIQ,RW}控制EL0/EL1/EL2的异常路由 逻辑1允许 |
ESR_ELx | 32bit | 保存异常进入ELx时的异常综合信息,包含异常类型EC等. |
VBAR_ELx | 64bit | 保存任意异常进入ELx的跳转向量基地址 x={0,1,2,3} |
PSTATE | 不是一个寄存 |
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』