自学内容网 自学内容网

【ARM】ARM入门基础

ARM的基础知识

ARM的分类和发展历程

在这里插入图片描述
v7时ARM产品线分三条支线:
移动领域cortex-A(A:Application 应用)
嵌入式cortex-M(M:MCU &FPGA)
实时性的cortex-R(R:Real-time实时)。

2021年时cortex-A又出现三个分支:
注重性能的超大核X系列;
移动领域的A系列;
服务器系列的Neoverse。

架构的含义

(1)关于架构,可以理解为时一个技术规范、技术参考、一个设计,有了架构产品就可以根据架构来设计。
(2)aarch64就是64位架构、aarch32就是32位架构。ARMv7中只包含aarch32架构,ARMv8同时包含了aarch32和aarch64,aARMv9逐将aarch32删除,在未来将全面实现aarch64。
(3)A64是指64位指令集架构,A32指32位指令集架构。
(4)ARM Core是ARM的IP,ARM还有其他IP,例如TZC400、MMU-550…
(5)架构和微架构的区别:
微架构follow架构,但微架构会做出一些详细的定义:
Number and sizes of caches.
Cycle counts for individual instructions.
Which optional features are implemented

基本术语

PE - processing element
ARM体系结构定义了抽象机器的行为,称为处理元素(processing element),通常缩写为PE。与ARM体系结构兼容的实现必须符合处理元素所描述的行为
Banked — 一个地址多份拷贝
banked by security、banked by EL、banked by core
ARM:Arm Architecture Reference Manual (Arm ARMs) - 架构类的文档, 一般就看这个
TRM:Arm Cortex processor has a Technical Reference Manual (TRM) - arm core的文档
Single-core :单核处理器是指只有一个中央处理单元(CPU核心)的处理器。在这样的处理器上,一次只能执行一个线程。
Multi-core: 多核处理器是指拥有两个或更多中央处理单元(CPU核心)的处理器。每个核心可以独立执行任务,这使得多任务处理和并行处理更加高效。
Single-thread: 单线程是指程序或进程中的一个执行流。在单线程程序中,所有的工作都是在一个执行流中顺序完成的,没有并行执行。
Multi-thread: 多线程是指程序或进程中包含多个执行流,即线程。每个线程可以独立执行,允许程序同时进行多个任务。在多核处理器上,多线程可以并行运行,提高程序的执行效率。
IMPLEMENTATION DEFINED:实现定义的,ARM自己的IP产品本身就是实现定义的,芯片厂商再设计时有实现定义。
DEPRECATED:弃用的
RISC:精简指令集计算机(RISC:Reduced Instruction Set Computing )是一种执行较少类型计算机指令的微处理器。
ARM架构是一个精简指令集计算机(RISC)架构,具有以下RISC架构特征:

  • 一种加载/存储架构,其中数据处理操作只对寄存器内容进行操作,而不是直接对内存内容进行操作。
  • 简单的寻址模式,所有的加载/存储地址仅由寄存器内容和指令字段决定。

权限栏(privilege level)

在这里插入图片描述

ARM的七种基本工作模式:

-User:非特权模式,大部分任务执行在这种模式;
-FIQ:当一个高优先级中断产生是将会进入这种模式;
-IRQ:当一个低优先级中中断产生时将会进入这种模式;
-Supervisor:党复位或软件中断(SGI)时会进入这种模式;
-Abort:当存取异常时将会进入这种模式;
-Undef:当执行未定义指令时会进入这种模式;
-System:使用和User模式相同寄存集的特权模式。

除了User和Normal外其他都是特权指令

Armv8的aarch64软件架构

在这里插入图片描述

系统架构的变化

在这里插入图片描述
基于big.LITTLE技术的八核处理器,并没有将传统内核放在单一的处理器上,而是一分为二,其中一个使用了4个“小核心”,另一个则使用了4个“大核心”,这两个“核心”都有着自己独立的速度和性能。当需要用智能手机打开一个网页时,手机就可以用一个大的内核来处理该任务,而小的内核则同时处理其他小任务,比如查看电子邮件、拨打电话等。big.LITTLE是一种节能省耗技术。
单一Cluster中可以又8个core,且支持不同架构的core,从而提升了工作效率和配置弹性。可以将不同类型的core放到一个cluster中。

ARM的异常

异常等级切换模型

1.ARMv8/ARMv9的aarch64架构中定义了4个异常级别:EL0,EL1,EL2,EL3,数字越高级别越高权限越高;
2.EL3/EL2/EL1是特权异常级别,EL0是非特权异常级别;
3.EL0和EL1是必须实现的
4.EL2和EL3都是实现定义的
5.异常永远不会taken到EL0

EL级别的切换

在这里插入图片描述
异常等级之间的切换,需要遵守一下规则:
移动到更高的异常等级,例如从EL0到EL1,表明增加了软件的执行权限;
异常不能切换到更低的等级;
EL0没有异常处理,异常只有在更高的异常等级(大于EL0)中才会被处理;
异常会改变程序的正常执行流程,异常处理器(Exception handler)在大于EL0的异常等级下开始执行,从一个先前被定义好的,与该异常相关的异常向量开始,异常包括:
(1)中断,比如 IRQ 和FIQ.
(2)内存系统中止
(3)未定义的指令。
(4)系统调用。一些异常调用的指令允许不具有特权的软件,通过系统调用指令,进入操作系统权限。
(5)Secure Monitor或者hypervisor 陷阱。
可以操作ERET指令来终止异常处理并且返回上一个异常等级
异常发生时,异常级别要不增加要不保持不变;
异常处理返回时,异常级别只能减小或保持不变。

(除非从EL3返回到非安全状态,否则安全状态不会随着Exception级别的更改而更改。)

EL1 sec如何变成 EL1 non-sec?

EL3是sec-world和non-sec world之间的gateway, 也就是说sec 想变成 non-sec,一定要经过EL3这条路。这同样可以说明跑在EL3下的管理程序为什么叫做 Secure monitor。
在这里插入图片描述
从上图中可以看出,先进入EL3 SEC,然后转成EL3 NSEC,最后通过ERET返回到EL1 NSEC;
因此它的路径为:EL1 SEC => EL3 SEC;EL3 SEC => EL3 NSEC;EL3 NSEC => EL1 NSEC

异常级别的应用

在这里插入图片描述
EL0:普通用户程序
EL1:特权函数
EL2:管理程序,管理员,切换操作系统时可以进入该状态
EL3:底层硬件

安全状态切换模型

在不考虑RME扩展的前提下:
1.ARM架构定义了两种安全状态Secure state和Non-secure state;
2.ARM架构定义了两套物理地址空间:Secure和Non-secure;
3.如果PE是Non-secure state,那么它只能访问非安全物理地址空间;
4.如果PE是Secure state,那么它既能访问安全物理地址空间,也能访问非安全物理地址空间;
5.EL3永远是Secure state;
6.EL2/EL1/EL0是安全状态还是非安全状态,要根据SCR_EL3.NS比特;
7.SCR_EL3.NS比特只能在EL3被修改
8.EL2是安全状态必须满足以下条件:
FEAT_SEL2 is implemented.
The Effective value of SCR_EL3.EEL2 is 0b1.
The Effective value of SCR_EL3.NS is 0b0.

假如当前处理器处于 EL1的Non-secure状态下,如果想进入EL1 Secure,该怎么做?

在这里插入图片描述

  1. 使用SMC指令,进入到EL3
  2. 改变SCR_EL3.NS的值,将NS位写1
  3. 然后从EL3返回(ERET)到EL1
    Non-secure 下,以及非EL3下访问不了SCR_EL3寄存器,所以只能在EL3的secure状态下将NS位写1,进入Non-secure状态。而不能在Non-secure状态下访问SCR,将NS位写0,进入Secure状态。

SMC指令将会产生一个进入EL3的异常,而EL3绝对不会在Non-secure的状态下实现。所以自然而然地可以使系统进入Secure 模式。并且会无视 SCR_EL3.NS 位,即不管NS为多少,都可以进入Secure状态。

在ARM架构中,SMC通常指的是Secure Monitor Call,即安全监控调用。这是一种特殊的函数调用,用于在不同的执行级别(如用户空间、操作系统内核空间和安全监控模式)之间进行通信,特别是在ARM的TrustZone安全技术中,用于实现安全世界(Secure World)和普通世界(Normal World)之间的切换。

Security的切换过程

在这里插入图片描述

执行状态切换(AArch64 <=> AArch32)

用户有时候需要改变系统的执行状态,比如在一个64-bit的系统下,想跑一个在EL0下32-bit的应用程序。为了实现这种需求,系统需要切换到AArch32状态。当32-bit应用 程序执行完毕,或者执行返回到OS时,系统可以切换回AArch64。
AArch64的操作系统可以跑AArch32和AArch64的应用程序,反之不行
只有在reset时或异常级别发生变化时,才能发生执行状体的切换
在这里插入图片描述

执行状态切换的要求

1.执行状态只能在异常从lower Exception level进入higher Exception level时,或从higher Exception level异常返回到lower Exception level时发生修改
2.如果异常进入或异常返回没有发生Exception Level变化,那么此时执行状态是不能被修改的
3.当产生一个异常从lower Exception level进入higher Exception level时,此时执行状态可能不变,或从aarch32变成aarch64,不能从aarch64变成aarch32
4.当一个异常返回从higher Exception level到lower Exception level时,此时执行状态可能不变,或从aarch32变成aarch64,不能从aarch64变成aarch32
4.当一个异常返回从higher Exception level到lower Exception level时,此时执行状态可能不变,或从aarch64变成aarch32,不能从aarch32变成aarch64
5.reset也能导致执行状态的变化

AArch32 和 AArch64状态之间切换的总结:

  • AArch64和AArch32的执行状态都有异常级别,它们通常是相似的,但是在安全操作和非安全操作之间存在一些差异。生成异常时处理器所处的执行状态可以限制其他执行状态可用的exception级别。
  • 从AArch 64 切换到 AArch32, 需要从 高 (higher) 异常等级 切换到 低 (lower)的异常等级。当 执行完
    ERET 指令后,异常处理器退出,状态将切换完成。
  • 从 AArch32 切换到 AArch64,则需要从 低 (lower)异常等级切换到 高 (higher)异常等级。这个异常可以是某些指令的执行结果,或者是一个外部信号。
  • 如果,从一个异常切换到另一个异常,但是异常等级没有变,是相同的,这样是无法改变 执行状态的。
  • 对于ARMv8处理器,在AArch32执行在某个异常级别,使用与ARMv7中相同的异常模型来处理进入该异常级别的异常。

状态切换后的寄存器状态

如果是从AArch32的异常等级切换到AArch64的异常等级:

之前在AArch32 任何更低的Exception级别下,可以访问的寄存器的高32位的值会变成UNKNOWN状态。
在AArch32执行期间不可访问的寄存器,将保留它们在AArch32执行之前的状态。
在EL3的异常入口时,之前一直使用AArch32 的EL2,其ELR_EL2的高32 bit的值也是未知的。
与异常等级相关的AArch64 Stack Pointers (SPs) and Exception Link Registers (ELRs)等寄存器,在之前AArch32状态下不可被访问,在该异常级别下,将保留它们在AArch32执行之前的状态。比如有:
SP_EL0.
SP_EL1.
SP_EL2.
ELR_EL1


原文地址:https://blog.csdn.net/DJIA403/article/details/142350701

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!