ARM两种授权
- 体系结构授权, 一种硬件规范, 用来约定指令集, 芯片内部体系结构(内存管理, 高速缓存管理), 只约定每一条指令的格式, 行为规范, 参数, 客户根据这个规范自行设计与之兼容的处理器
- 处理IP授权, ARM公司根据某个版本的体系结构设计处理器, 再把处理器设计方案授权给客户
ARM体系结构又根据不同的应用场景分为3种系列
- A系列: 面向性能密集型系统的应用处理器内核
- R系列: 面向实时应用的高性能内核
- M系列: 面向各类嵌入式应用的微控制内核
ARMv8体系结构中的基本概念
ARM处理器实现的是精简指令集体系结构。在ARMv8体系结构中有如下一些基本概念和定义。
- 处理机(Processing Element,PE):在ARM公司的官方技术手册中提到的一个概念,把处理器处理事务的过程抽象为处理机。
- 执行状态(execution state):处理器运行时的环境,包括寄存器的位宽、支持的指令集、异常模型、内存管理以及编程模型等。ARMv8体系结构定义了两个执行状态。
- AArch64:64位的执行状态。
- 提供31个64位的通用寄存器。提供64位的程序计数(Program Counter,PC)指针寄存器、栈指针(Stack Pointer,SP)寄存器以及异常链接寄存器(Exception Link Register,ELR)。
- 提供A64指令集。定义ARMv8异常模型,支持4个异常等级,即EL0~EL3。
- 提供64位的内存模型。定义一组处理器状态(PSTATE)用来保存PE的状态。
- AArch32:32位的执行状态。
- 提供13个32位的通用寄存器,再加上PC指针寄存器、SP寄存器、链接寄存器(Link Register,LR)。
- 支持两套指令集,分别是A32和T32(Thumb指令集)指令集。
- 支持ARMv7-A异常模型,基于PE模式并映射到ARMv8的异常模型中。
- 提供32位的虚拟内存访问机制。
- 定义一组PSTATE用来保存PE的状态。
- AArch64:64位的执行状态。
- ARMv8指令集:ARMv8体系结构根据不同的执行状态提供不同指令集的支持。A64指令集:运行在AArch64状态下,提供64位指令集支持。A32指令集:运行在AArch32状态下,提供32位指令集支持。T32指令集:运行在AArch32状态下,提供16位和32位指令集支持。
- 系统寄存器命名:在AArch64状态下,很多系统寄存器会根据不同的异常等级提供不同的变种寄存器。系统寄存器的使用方法如下。
<register_name>_Elx //最后一个字母 x 可以表示0、1、2、3
如SP_EL0表示在EL0下的SP寄存器,SP_EL1表示在EL1下的SP寄存器。
ARMv8处理器执行状态
ARMv8处理器支持两种执行状态——AArch64状态和AArch32状态
AArch64状态是ARMv8新增的64位执行状态,而AArch32是为了兼容ARMv7体系结构的32位执行状态
AArch32执行状态
支持16个32位的通用寄存器
ARMv8体系架构下AArch64执行状态
异常等级
确定了处理器当前运行特权级别
- EL0:用户特权,用于运行普通用户程序。
- EL1:系统特权,通常用于操作系统内核。如果系统使能了虚拟化扩展,运行虚拟机操作系统内核。
- EL2:运行虚拟化扩展的虚拟机监控器(hypervisor)。
- EL3:运行安全世界中的安全监控器(secure monitor)
ARMv8体系结构允许切换应用程序的运行模式。如在一个运行64位操作系统的ARMv8处理器中,我们可以同时运行A64指令集的应用程序和A32指令集的应用程序,但是在一个运行32位操作系统的ARMv8处理器中就不能运行A64指令集的应用程序了。
当需要运行A32指令集的应用程序时,需要通过一条管理员调用(Supervisor Call,SVC)指令切换到EL1,操作系统会做任务的切换并且返回AArch32的EL0,从而为这个应用程序准备好AArch32状态的运行环境。
通用寄存器
支持31个64位的, 分别是X0 ~ X30
可以使用W来表示低32位的数据, W0表示X0寄存器的低32位数据, W1表示X1寄存器的低32位数据
特殊寄存器
系统寄存器
ARMv8体系结构支持如下7类系统寄存器:
- 通用系统控制寄存器;
- 调试寄存器;
- 性能监控寄存器;
- 活动监控寄存器;
- 统计扩展寄存器;
- RAS寄存器;
- 通用定时器寄存器。
系统寄存器支持不同的异常等级的访问,通常系统寄存器会使用“Reg_ELn”的方式来表示。
- Reg_EL1:处理器处于EL1、EL2以及EL3时可以访问该寄存器。
- Reg_EL2:处理器处于EL2和EL3时可以访问该寄存器。
- 大部分系统寄存器不支持处理器处于EL0时访问,但也有一些例外,如CTR_EL0。
数据类型
支持的数据宽度
字节(8bit), 半字(16bit), 字(32bit), 双字(64bit),四字(128bit)