ARMv8-AArch64 的异常处理模型详解之异常处理详解(进入异常以及异常路由)
在上篇文章 ARMv8-AArch64 的异常处理模型详解之异常处理概述Handling exceptions中,作者对异常处理整体流程以及相关概念做了梳理。接下来,本文将详细介绍处理器在获取异常、异常处理以及异常返回等过程中都做了哪些工作。
ARMv8-AArch64 的异常处理模型详解之异常处理详解
- 一, 保存当前处理器状态(Saving the current processor state)
- PSTATE,Processor state
- PSTATE at AArch32
- SPSR,Saved Process Status Register
- 二,异常路由以及中断控制器
- SCR_EL3, Secure Configuration Register
- RW, bit [10], Execution state control for lower Exception levels.
- HCE, bit [8],Hypervisor Call instruction enable. HVC指令使能
- SMD, bit [7],Secure Monitor Call disable. 禁止使用SMC指令
- EA, bit [3],External Abort and SError interrupt routing,用于控制是否将外部异常以及SError路由到EL3
- FIQ, bit [2],IRQ, bit [1],用于控制IRQ和FIQ是否要路由到EL3
- NS, bit [0],用于控制EL2,EL1,以及EL0是否处于Non-secure状态
一, 保存当前处理器状态(Saving the current processor state)
在ARMv7以及更早的架构中,有个程序状态寄存器(CPSR)来保存当前处理器的状态。而在ARMv8架构中,该寄存器被称为PSTATE(processor state)。PSTATE里包含了当前异常等级以及算数逻辑单元(Arithmetical Logical Unit (ALU))的一些标志位。在AArch64下,它们包括:
-
状态标志位,Condition flags
-
执行状态控制,Execution state controls
-
异常屏蔽位,Exception mask bits
-
访问控制位,Access control bits
-
Timing control bits
-
Speculation control bits
比如PSTATE中有四个屏蔽bit(DAIF),用于屏蔽四种异常: -
D - 调试屏蔽,Debug exception mask bit
-
A - SError异步异常屏蔽,SError asynchronous exception mask bit, for example, asynchronous external abort
-
I - IRQ异步异常屏蔽,IRQ asynchronous exception mask bit
-
F -FIQ异步异常屏蔽, FIQ asynchronous exception mask bit
PSTATE,Processor state
下图为AArch64模式下的PSTATE各个bit的功能描述表格:

在AArch64下,当使用ERET指令进行异常返回时,会让SPSR_ELn的值拷贝到PSTATE中。该操作会让处理器恢复到异常处理前的状态,其中包括:ALU的状态标志位(NZCV),执行状态(AArch64 或者AArch32),当前所处的异常等级以及处理器分支等等。并且将ELR_ELn中保存的地址恢复到PC(Program Counter)中,让处理器从该地址继续工作。
需要注意的是,PSTATE.{N, Z, C, V}可以在EL0下被访问,除了这四个bit,PSTATE的其他bit只能在EL1及更高的异常等级下被访问,对EL0来说是未定义的。
PSTATE at AArch32
在AArch32下,为了与ARMv7的CPSR相对应,PSTATE相比于AArch64,有额外的一些bit:


SPSR,Saved Process Status Register
当异常发生时,处理器的PSTATE会被保存到对应的SPSR中,SPSR的作用相当于临时保存PSTATE的值,等到异常处理完成,执行了ERET指令后,SPSR的值将会重新写入到PSTATE中。

以下是AArch64下的SPSR的bit功能:

在ARMv8中,SPSR有三个:, SPSR_EL3,, SPSR_EL2以及SPSR_EL1。异常发生在哪个异常等级(taken to)就用哪个SPSR,比如异常发生在EL1(taken to EL1,taken from EL0),则使用SPSR_EL1,并且ELR_ELn和SPSR_ELn是成对使用的。
当PSTATE的值在SPSR里有了备份,然后,处理器就可以将当前的PSTATE更新为体系结构中为该异常类型定义的PSTATE,以反映新的状态。这包括更新受影响的目标异常级别和安全级别。当PSTATE被更新后,处理器就可以跳转到异常向量表的的异常处理函数中,具体从哪个目标异常等级的异常向量开始执行,这个由异常类型决定。
下图为EL0->EL1->EL0的异常处理示意图,在异常处理前需要将PC和PSTATE备份到ELR以及SPSR中,由于目标异常等级为EL1(taken to EL1),所以写入ELR_EL1以及SPSR_EL1中,在异常处理完成后,再将ELR_EL1以及SPSR_EL1中的值恢复到PC和PSTATE中。

二,异常路由以及中断控制器
事实上,每种异常类型都有一个目标异常等级,有以下两种方式来指定:
- 通过异常类型隐式地指定。
- 由系统控制寄存器中的配置bit来指定。
总的来说,异常的目标异常等级要么是由架构实现定义的(固定,不可更改),要么就是软件使用路由控制来配置的。此外,异常的目标异常等级不能是EL0(taken to EL0)。
同步异常将根据与异常生成指令SVC、HVC和SMC相关联的规则进行路由。当系统实现了EL2或者EL3时,可以将其他类型的异常路由到EL2(Hypervisor)或EL3(Secure Monitor)。异常路由对IRQ、FIQ以及SError来说是独立设置的,如下图所示,在某个实现实例中,可以将所有的IRQ中断都路由到EL1中。

SCR_EL3, Secure Configuration Register
当EL3被实现时,安全配置寄存器SCR_EL3才能被访问。它主要用于配置当前处理器的安全状态,包括如下配置:
- EL0,EL1和EL2的安全状态,可以是Secure,Non-secure以及Realm。(EL3肯定是Secure的)
- 更低的异常等级的执行状态(AArch32还是AArch64)。
- IRQ、FIQ,SError中断以及外部中止异常(External abort exceptions)是否要在EL3下处理。
- 某些操作是否要在EL3下执行。
SCR_EL3是一个64-bit寄存器,它的各个bit如下图所示:

RW, bit [10], Execution state control for lower Exception levels.

HCE, bit [8],Hypervisor Call instruction enable. HVC指令使能

SMD, bit [7],Secure Monitor Call disable. 禁止使用SMC指令

EA, bit [3],External Abort and SError interrupt routing,用于控制是否将外部异常以及SError路由到EL3

FIQ, bit [2],IRQ, bit [1],用于控制IRQ和FIQ是否要路由到EL3


NS, bit [0],用于控制EL2,EL1,以及EL0是否处于Non-secure状态

上小节简单介绍了安全配置寄存器SCR_EL3的用来配置异常路由的相关bit。除了SCR_EL3,还有Hypervisor
Configuration Register HCR_EL2。SCR_EL3寄存器指定哪些异常被路由到EL3,而HCR_EL2寄存器同样指定哪些异常被路由到EL2。
通过配置这些寄存器,可以将不同的中断类型路由到不同的异常级别。例如,IRQ中断可能由EL1的操作系统处理,而SErrors通常是由运行在EL3的固件处理。
在SCR_EL3以及HCR_EL2中都有单独的控制bit,允许单独控制IRQ、FIQ和SError中断的路由。如果SCR_EL3和HCR_EL2中的配置发生冲突时,SCR_EL3的路由配置会覆盖掉HCR_EL2中的配置。此外,这些控制bit在reset后的值是未知的,需要由软件来初始化。
在ARM架构中,有一个独立的模块:Generic Interrupt Controller (GIC),ARM 通用中断控制器,用于中断的管理,优先级分配以及中断路由。
在之前介绍异步异常的时候提到过,异步异常可以暂时屏蔽并保持pending状态,直到异常被解除屏蔽并被获取。异常路由也会影响异常屏蔽,因为屏蔽的能力取决于当前和目标异常等级。
- 路由到较高异常级别的异常无法被较低的EL屏蔽(Target EL > Current EL)。例如,如果中断在EL1中被屏蔽,并且一个中断被路由到EL2,那么EL1的屏蔽设置将不会影响EL2的操作。但是,当处理器从EL2退出时,EL2的中断可能已经被屏蔽,这仍然可能导致中断在进入EL2时被屏蔽。
- 如果异常没有导致异常等级更改(Target EL == Current EL),那么路由到当前异常级别的异常可以被当前级别屏蔽。
- 路由到较低异常级别的异常总是可以被屏蔽(Target EL < Current EL)。

接收异常的异常级别(taken to)的执行状态由更高的异常级别决定。假设所有异常级别都已实现,下表显示了如何确定某个异常等级的执行状态(AArch32 or AArch64):

相关文章:
ARMv8-AArch64 的异常处理模型详解之异常处理详解(进入异常以及异常路由)
在上篇文章 ARMv8-AArch64 的异常处理模型详解之异常处理概述Handling exceptions中,作者对异常处理整体流程以及相关概念做了梳理。接下来,本文将详细介绍处理器在获取异常、异常处理以及异常返回等过程中都做了哪些工作。 ARMv8-AArch64 的异常处理模型…...
unity学习(19)——客户端与服务器合力完成注册功能(1)入门准备
逆向服务器用了三天的时间,但此时觉得一切都值,又可以继续学习了。 服务器中登录请求和注册请求由command变量进行区分,上一层的type变量都是login。 public void process(Session session, SocketModel model) {switch (model.Command){ca…...
论文精读--对比学习论文综述
InstDisc 提出了个体判别任务,而且利用这个代理任务与NCE Loss去做对比学习从而得到了不错的无监督表征学习的结果;同时提出了别的数据结构——Memory Bank来存储大量负样本;解决如何对特征进行动量式的更新 翻译: 有监督学习的…...
文章复现 | 差异分析和PPI网络构建
原文链接:差异分析和PPI网路图绘制教程 写在前面 在原文中,作者获得285个DEG,在此推文中共获得601个DEG。小杜的猜想是标准化的水段不同的原因吧,或是其他的原因。此外,惊奇的发现发表医学类的文章在附件中都不提供相…...
入门级10寸加固行业平板—EM-I10J
亿道信息以其坚固耐用的智能终端设备而闻名,近日发布了一款理想入门级 10 英寸加固平板电脑—I10J。 EM-I10J 这是一款 10 英寸的平板电脑,主要运行 Windows 10操作系统,带有硬化塑料外壳,具有 IP65 防水防尘功能和 MIL-STD 8…...
gem5 garnet 合成流量: packet注入流程
代码流程 下图就是全部. 剩下文字部分是细节补充,但是内容不变: bash调用python,用python配置好configuration, 一个cpu每个tick运行一次,requestport发出pkt. bash 启动 python文件并配置 ./build/NULL/gem5.debug configs/example/garnet_synth_traffic.py \--num-cpus…...
java实现排序算法(上)
排序算法 冒泡排序 时间和空间复杂度 要点 每轮冒泡不断地比较比较相邻的两个元素,如果它们是逆序的,则需要交换它们的位置下一轮冒泡,可以调整未排序的右边界,减少不必要比较 代码 public static int[] test(int[] array) {// 外层循环控制遍历次数for (int i 0; i <…...
「算法」滑动窗口
前言 算法需要多刷题积累经验,所以我行文重心在于分析解题思路,理论知识部分会相对简略一些 正文 滑动窗口属于双指针,这两个指针是同向前行,它们所夹的区间就称为“窗口” 啥时候用滑动窗口? 题目涉及到“子序列…...
Windows11(非WSL)安装Installing llama-cpp-python with GPU Support
直接安装,只支持CPU。想支持GPU,麻烦一些。 1. 安装CUDA Toolkit (NVIDIA CUDA Toolkit (available at https://developer.nvidia.com/cuda-downloads) 2. 安装如下物件: gitpythoncmakeVisual Studio Community (make sure you install t…...
rtt设备io框架面向对象学习-脉冲编码器设备
目录 1.脉冲编码器设备基类2.脉冲编码器设备基类的子类3.初始化/构造流程3.1设备驱动层3.2 设备驱动框架层3.3 设备io管理层 4.总结5.使用 1.脉冲编码器设备基类 此层处于设备驱动框架层。也是抽象类。 在/ components / drivers / include / drivers 下的pulse_encoder.h定义…...
华为OD机试真题- 攀登者2-2024年OD统一考试(C卷)
题目描述: 攀登者喜欢寻找各种地图,并且尝试攀登到最高的山峰。地图表示为一维数组,数组的索引代表水平位置,数组的高度代表相对海拔高度。其中数组元素0代表地面。例如[0,1,4,3,1,0,0,1,2,3,1,2,1,0], 代表如下图所示的地图,地图中有两个山脉位置分别为 1,2,3,4,5和8,9,1…...
19.Qt 组合框的实现和应用
目录 前言: 技能: 内容: 1. 界面 2.槽 3.样式表 参考: 前言: 学习QCombox控件的使用 技能: 简单实现组合框效果 内容: 1. 界面 在ui编辑界面找到input widget里面的comboBoxÿ…...
【Linux】进程地址空间的理解
进程地址空间的理解 一,什么是程序地址空间二,页表和虚拟地址空间三,为什么要有进程地址空间 一,什么是程序地址空间 在我们写程序时,都会有这样下面的内存结构,来存放变量和代码等数据。 一个进程要执行…...
【Jvm】类加载机制(Class Loading Mechanism)原理及应用场景
文章目录 Jvm基本组成一.什么是JVM类的加载二.类的生命周期阶段1:加载阶段2:验证阶段3:准备阶段4:解析阶段5:初始化 三.类初始化时机四.类加载器1.引导类加载器(Bootstrap Class Loader)2.拓展类…...
Spring AOP的实现方式
AOP基本概念 Spring框架的两大核心:IoC和AOP AOP:Aspect Oriented Programming(面向切面编程) AOP是一种思想,是对某一类事情的集中处理 面向切面编程:切面就是指某一类特定的问题,所以AOP可…...
Linux------环境变量
目录 前言 一、环境变量 二、添加PATH环境变量 三、HOME环境变量 四、查看所有环境变量 1.指令获取 2.代码获取 2.1 getenv 2.2main函数的第三个参数 2.3 全局变量environ 五、环境变量存放地点 六、添加自命名环境变量 七、系统环境变量具有全局属性 八、环境变…...
计算机视觉所需要的数学基础
计算机视觉领域中使用的数学知识广泛而深入,以下是一些关键知识点及其在计算机视觉中的应用: 线性代数: - 矩阵运算:用于图像的表示和处理,如图像旋转、缩放、裁剪等。 - 向量空间:用于描述图像中的…...
ChatGPT魔法1: 背后的原理
1. AI的三个阶段 1) 上世纪50~60年代,计算机刚刚产生 2) Machine learning 3) Deep learning, 有神经网络, 最有代表性的是ChatGPT, GPT(Generative Pre-Trained Transformer) 2. 深度神经网络 llya Suts…...
【c/c++】获取时间
在一些应用的编写中我们有时候需要用到时间,或者需要一个“锚点”来确定一些数的值。在c/c中有两个用来确定时间的函数:time/gettimeofday 一、time time_t time(time_t *timer);time 函数返回当前时间的时间戳(自 1970 年 1 月 1 日以来经…...
uniapp富文本文字长按选中(用于复制,兼容H5、APP、小程序三端)
方案:使用u-parse的selectable属性 <u-parse :selectable"true" :html"content"></u-parse> 注意:u-parse直接使用是不兼容小程序的,需要对u-parse进行改造: 1. 查看u-parse源码发现小程序走到以…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果:def __in…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
