×
单片机 > 单片机程序设计 > 详情

ARMv8 架构与指令集.学习笔记

发布时间:2020-08-26 发布时间:
|

第1章 ARMv8简介

1.1基础认识

ARMv8的架构继承以往ARMv7与之前处理器技术的基础,除了现有的16/32bit的Thumb2指令支持外,也向前兼容现有的A32(ARM 32bit)指令集,基于64bit的AArch64架构,除了新增A64(ARM 64bit)指令集外,也扩充了现有的A32(ARM 32bit)和T32(Thumb2 32bit)指令集,另外还新增加了CRYPTO(加密)模块支持。

1.2 相关专业名词解释

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)

 

第2章 Execution State

2.1 提供两种Execution State

• 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当前的状态信息

没有协处理器概念

 

2.2 决定Execution State的条件

 

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则是可选实现

3.1 Exception Level 与Security

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,可起到物理屏障安全隔离作用

 

3.1.1 EL3使用AArch64、AArch32的对比


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

 

3.3.2 IRQ/FIQ/SError路由流程图

位宽

分类

32-bit

Wn(通用)

WZR(0寄存器)

WSP(堆栈指针)

64-bit

Xn(通用)

XZR(0寄存器)

SP(堆栈指针)

 

4.1 AArch32重要寄存器

寄存器类型

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环境下

 

4.1.1 A32状态下寄存器组织

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

 

4.2 AArch64重要寄存器

寄存器类型

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


不是一个寄存


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32单片机的复用端口初始化的步骤及方法